假设我们有一张表格。一个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"
添加按钮。不幸的是,这并没有改变一件事。不处理输入字段值,但需要更新表单。我没有提交上面提交的值。我错过了什么?有没有解决方法?
答案 0 :(得分:4)
只需让required
属性检查是否按下了“完成”按钮。如果是这种情况,则按钮自己的客户端ID作为请求参数出现。请求参数可通过#{param}
映射获得。您可以使用按钮的binding
属性将物理组件绑定到视图,以便您可以在其他位置抓取UIComponent#getClientId()
。最后只需做布尔逻辑。
E.g。
<p:commandButton binding="#{done}" ... />
...
<p:inputText ... required="#{not empty param[done.clientId]}" />
答案 1 :(得分:-1)
这样的事情会起作用吗?
<p:inputText value="#{l.name}" required="#{l.name != null ? true : false}"/>
这将不需要新添加的inputText组件,但强制执行列表中已有的项目。