web-dev-qa-db-fra.com

Comment ajouter dynamiquement des composants JSF

Puis-je ajouter des composants JSF de manière dynamique? J'ai besoin d'un formulaire avec un bouton qui devrait ajouter un <h:inputText> au formulaire. Est-ce possible?

Je sais que cela devrait être possible en JavaScript. Est-ce que quelqu'un sait comment faire cela dans JSF? Je pense que le problème majeur est de savoir comment obtenir ou définir les valeurs des nouvelles entrées via #{value}.

25
ErVeY

Utilisez un composant itératif tel que <h:dataTable> ou <ui:repeat> pour afficher une List de taille dynamique __ d'entités. Créez le bean @ViewScoped pour vous assurer que la liste est mémorisée dans les publications sur la même vue au lieu d'être recréée à plusieurs reprises.

Exemple de démarrage avec <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>

Fève gérée:

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

}

Modèle:

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

}

Voir également:

30
BalusC

Ça devrait être comme ça

Lier une balise de formulaire à la propriété de haricot


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

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

sur event, créer une nouvelle instance du composant input

HtmlInputText input=new HtmlInputText();

et attachez-le à votre formulaire

myform.getChildren().add(input);
1
corsair

Utilisez h:dataTable pour ajouter des éléments de manière dynamique ... Ayez une liste de tout type pour laquelle vous souhaitez fournir des valeurs pour dataTable ...

Dans h:dataTable... vous pouvez inclure la balise d'élément à créer dans <h:column>

Il sera utilisé pour générer les éléments que vous souhaitez créer de manière dynamique.

0
Arun