Pergunta

Posso adicionar componentes JSF dinamicamente? Eu preciso ter um formulário com um botão que deve adicionar um <h:inputText> para o formulário. Isso é possível?

Eu sei que isso deve ser possível em JavaScript de alguma forma. Alguém sabe como fazer isso no JSF? Eu acho que o principal problema é como obtenho ou defina valores de novas entradas via #{value}.

Foi útil?

Solução

Use um componente de iteração como <h:dataTable> ou <ui:repeat> Para exibir um tamanho dinamicamente List de entidades. Faça o feijão @ViewScoped Para garantir que a lista seja lembrada entre os postagens na mesma visão, em vez de recriada repetidamente.

Exemplo de kickoff com <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 gerenciado:

@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);
    }

}

Veja também:

Outras dicas

Deve ser assim

Vincule uma etiqueta de formulário à propriedade Bean


<form binding="#{myBean.myform}">...</form>

@ManagedBean("myBean")
public class Bean{
   property HtmlForm myform;
}

No evento, crie uma nova instância do componente de entrada

HtmlInputText input=new HtmlInputText();

e anexe ao seu formulário

myform.getChildren().add(input);

Usar h:dataTable Para adicionar elementos dinamicamente ... tenha uma lista de qualquer tipo que você queira fornecer valores para o DataTable ...

Dentro h:dataTable... você pode incluir a tag de elemento para criar dentro <h:column>

Ele será usado para gerar elementos que você deseja criar dinamicamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top