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