假设我们有一个表格。一个p:inputText
可见但用户可以使用p:commandButton
. 所有这些值都必须在与另一个提交时提供p:commandButton
。当用户尝试添加多个空输入字段时会出现问题。所有这些都被标记required="true"
,因此当一个字段为空并且用户尝试添加另一个字段时会出现验证错误。
最好的办法是允许根据用户需要添加尽可能多的字段,然后填写并提交。
JSF:
<h:form id="myForm">
<p:commandButton value="add" actionListener="#{testBean.addNewItem()}" update="@form"/>
<p:commandButton value="done" update="@form,:p"/>
<br/>
<ui:repeat value="#{testBean.list}" var="l">
<p:inputText value="#{l.name}" required="true"/>
<br/>
</ui:repeat>
</h:form>
<p:messages autoUpdate="true"/>
<p:panel id="p">
#{testBean.list}
</p:panel>
支持 bean 没有什么花哨的。只为列表提供 getter 和 setter。它还将空字符串添加到列表中。
@ManagedBean
@ViewScoped
public class TestBean implements Serializable {
private List<Item> list = new ArrayList<Item>();
public List<Item> getList() { return list; }
public void setList(List<Item> list) { this.list = list; }
public void addNewItem() { list.add(new Item()); }
}
我可以:
- 删除字段要求 - 不是一个选项。
- 添加
immediate="true"
用于添加按钮。验证现在不是问题,但它会导致所有已填写但未提交的值消失。而且我需要更新@form
,因为只有这样新添加的字段才会由ui:repeat
. - 我试图添加
process="@this"
添加按钮。不幸的是,这并没有改变任何事情。不处理输入字段值,但需要更新表单。我失去了上述未提交的值。
我错过了什么?有什么解决方法吗?