Как динамически добавлять компоненты JSF
-
25-09-2019 - |
Вопрос
Могу ли я добавить компоненты JSF динамически? Мне нужно иметь форму с кнопкой, которая должна добавить один <h:inputText>
к форме. Это возможно?
Я знаю, что это должно быть возможно в JavaScript как-то. Кто-нибудь узнать, как это сделать в JSF? Я думаю, что основная проблема заключается в том, как я могу получить или устанавливать значения новых входов через #{value}
.
Решение
Используйте итерационный компонент, как <h:dataTable>
или <ui:repeat>
Для отображения динамически размера List
организаций. Составлять боб @ViewScoped
Чтобы убедиться, что список запоминается через отходы на том же мнениях, а не воссоздать и снова.
Пример по выбору <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>
Управляемый боб:
@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;
}
}
Модель:
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);
}
}
Смотрите также:
Другие советы
Это должно быть так
Связать тег формы к свойству компонента
<form binding="#{myBean.myform}">...</form>
@ManagedBean("myBean")
public class Bean{
property HtmlForm myform;
}
На событии создайте новый экземпляр входного компонента
HtmlInputText input=new HtmlInputText();
и прикрепить к вашей форме
myform.getChildren().add(input);
Использовать h:dataTable
Чтобы добавить элементы динамически ... иметь список любого типа, который вы хотите предоставить значения для DataTable ...
В h:dataTable
... Вы можете включить тег элемента для создания внутри <h:column>
Он будет использоваться для генерации элементов, которые вы хотите создавать динамически.