【发布时间】:2016-08-27 18:44:40
【问题描述】:
我可以动态添加 JSF 组件吗?我需要一个带有按钮的表单,该按钮应该在表单中添加一个<h:inputText>。这可能吗?
我知道这在 JavaScript 中应该是可能的。有人知道如何在 JSF 中做到这一点吗?我认为主要问题是如何通过#{value} 获取或设置新输入的值。
【问题讨论】:
标签: jsf jsf-2 dynamic-forms
我可以动态添加 JSF 组件吗?我需要一个带有按钮的表单,该按钮应该在表单中添加一个<h:inputText>。这可能吗?
我知道这在 JavaScript 中应该是可能的。有人知道如何在 JSF 中做到这一点吗?我认为主要问题是如何通过#{value} 获取或设置新输入的值。
【问题讨论】:
标签: jsf jsf-2 dynamic-forms
使用<h:dataTable> 或<ui:repeat> 等迭代组件来显示动态大小的List 实体。制作 bean @ViewScoped 以确保在同一视图上的回发中记住该列表,而不是一遍又一遍地重新创建。
使用<h:dataTable> 的启动示例(使用<ui:repeat> 时只需将<h:dataTable> 替换为<ui:repeat>,并将<h:column> 替换为例如<li> 或<div>):
<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:
@Named
@ViewScoped
public class Bean {
private List<Item> items;
@PostConstruct
public void init() {
items = new ArrayList<>();
}
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);
}
}
【讨论】:
new HtmlInputText() 等,但这只会导致托管 bean 中出现讨厌和不透明的代码。
应该是这样的
将表单标签绑定到 bean 属性
<form binding="#{myBean.myform}">...</form>
@ManagedBean("myBean")
public class Bean{
property HtmlForm myform;
}
在事件发生时,创建输入组件的新实例
HtmlInputText input=new HtmlInputText();
并附加到您的表单
myform.getChildren().add(input);
【讨论】:
FacesContext.getCurrentInstance().getApplication().createComponent(HtmlInputText.COMPONENT_TYPE);
使用h:dataTable 动态添加元素...拥有您想要为dataTable 提供值的任何类型的列表...
在h:dataTable...中,您可以在<h:column>中包含要创建的元素标签
它将用于生成您想要动态创建的元素。
【讨论】: