Cómo agregar dinámicamente componentes JSF

Puedo agregar componentes JSF de forma dinámica? Tengo un formulario con un botón que debería agregar una <h:inputText> a la forma. Es esto posible?

Sé que esto debería ser posible en JavaScript de alguna manera. ¿Alguien sabe cómo hacer esto en JSF? Creo que el principal problema es ¿cómo puedo obtener o establecer los valores de las nuevas entradas a través de #{value}.

OriginalEl autor ErVeY | 2010-08-04

3 Kommentare

  1. 30

    El uso de un componente de la iteración como <h:dataTable> o <ui:repeat> para mostrar dinámicamente el tamaño List de entidades. Hacer el frijol @ViewScoped para asegurarse de que la lista es recordado a través de las devoluciones en el mismo punto de vista en lugar de recreado una y otra vez.

    Kickoff ejemplo con <h:dataTable>:

    <h:form>
        <h:dataTable value="#{bean.items}" var="item">
            <h:column><h:inputText value="#{item.value}" /></h:column>
            <h:column><h:commandButton value="remove" action="#{bean.remove(item)}" /></h:column>
        </h:dataTable>
        <h:commandButton value="add" action="#{bean.add}" />
        <h:commandButton value="save" action="#{bean.save}" />
    </h:form>

    Bean gestionado:

    @ManagedBean
    @ViewScoped
    public class Bean {
    
        private List<Item> items;
    
        @PostConstruct
        public void init() {
            items = new ArrayList<Item>();
        }
    
        public void add() {
            items.add(new Item());
        }
    
        public void remove(Item item) {
            items.remove(item);
        }
    
        public void save() {
            System.out.println("items: " + items);
        }
    
        public List<Item> getItems() {
            return items;
        }
    
    }

    Modelo:

    public class Item {
    
        private String value;
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
        public String toString() {
            return String.format("Item[value=%s]", value);
        }
    
    }

    Véase también:

    gracias, estaba pensando en la misma cosa, sólo preguntando si era la mejor manera de hacerlo = D
    Verdadero. La única alternativa sería la creación de componentes de programación como new HtmlInputText() y así sucesivamente, pero eso sólo provocaría desagradable y opaco código en managed bean.
    Hola, @BalusC, es oportuno añadir un campo «nombre» a la clase de Elemento? Necesito guardar los elementos en DB y debo leerlos DB.
    Gracias, fue muy útil.
    Yo hice este enfoque. Pero cuando yo escriba un nuevo valor en el agregado de entrada y pulse enviar, la lista de los backing bean no está actualizado. Lo que puede estar mal? Mis artículos son una Lista de<Cadena>, podría ser? No puede cambiar la cadena en la Lista?

    OriginalEl autor BalusC

  2. 1

    Es como debe ser que

    Enlazar una etiqueta de formulario para el bean de propiedad

    
    <form binding="#{myBean.myform}">...</form>
    
    @ManagedBean("myBean")
    public class Bean{
       property HtmlForm myform;
    }

    del evento, crear una nueva instancia de la componente de entrada

    HtmlInputText input=new HtmlInputText();

    y adjuntarlo a su formulario de

    myform.getChildren().add(input);
    Por favor, nunca crear nuevas instancias del componente de sí mismo. La forma preferida es esta: FacesContext.getCurrentInstance().getApplication().createComponent(HtmlInputText.COMPONENT_TYPE);

    OriginalEl autor corsair

  3. 0

    Uso h:dataTable para agregar elementos dinámicamente… Tiene una lista de cualquier tipo que desee proporcionar valores para dataTable…

    En h:dataTable… puede incluir el elemento de la etiqueta para crear dentro de <h:column>

    Será utilizado para generar los elementos que desea crear de forma dinámica.

    Bienvenido al Desbordamiento de la Pila! Esta respuesta no parece añadir nada sustancial en la parte superior de la ya dada respuestas hasta el momento. Desbordamiento de pila no es un foro de discusión donde todos se repite cada uno de los otros de acuerdo, pero es una pregunta&respuesta del sitio donde todo el mundo da un upvote en un acuerdo o un downvote en desacuerdo. Si usted gana 15 reputación, entonces usted puede lanzar upvotes.

    OriginalEl autor Arun

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea