2

假设我们有一个表格。一个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()); }
}

我可以:

  1. 删除字段要求 - 不是一个选项。
  2. 添加immediate="true"用于添加按钮。验证现在不是问题,但它会导致所有已填写但未提交的值消失。而且我需要更新@form,因为只有这样新添加的字段才会由ui:repeat.
  3. 我试图添加process="@this"添加按钮。不幸的是,这并没有改变任何事情。不处理输入字段值,但需要更新表单。我失去了上述未提交的值。

我错过了什么?有什么解决方法吗?

4

2 回答 2

4

只需让required属性检查是否按下了“完成”按钮。如果是这种情况,按钮自己的客户端 ID 将作为请求参数出现。请求参数可通过#{param}映射获得。您可以使用按钮的binding属性将物理组件绑定到视图,以便您可以在UIComponent#getClientId()其他地方抓取它。最后只做布尔逻辑。

例如

<p:commandButton binding="#{done}" ... />
...
<p:inputText ... required="#{not empty param[done.clientId]}" />
于 2013-08-27T19:59:31.633 回答
-1

这样的事情会起作用吗?

<p:inputText value="#{l.name}" required="#{l.name != null ? true : false}"/>

这将使新添加的 inputText 组件不是必需的,但强制列表中已经存在的项目是必需的。

于 2013-08-27T19:34:48.113 回答