【问题标题】:OmniFaces o:validateAllOrNone in ui:repeat or h:dataTableOmniFaces o:validateAllOrNone 在 ui:repeat 或 h:dataTable
【发布时间】:2013-05-22 12:23:35
【问题描述】:

是否可以在 <ui:repeat><h:dataTable> 中使用 OmniFaces <o:validateAllOrNone>(这很酷;))?

我需要一个表格,每行都有一个输入字段列。您可以不填写这些值,也可以全部填写。

如果我将<o:validateAllOrNone> 放在<ui:repeat><h:dataTable> 中,并在components 属性中使用输入字段的ID,那么如果所有字段都为空,验证器也会被触发。

【问题讨论】:

    标签: jsf-2 datatable validation omnifaces


    【解决方案1】:

    不,这是不可能的。 components 属性必须在物理上引用多个组件,而不是多次呈现的单个组件。但是,它可以用于在同一迭代轮次中渲染的物理多个组件。 <o:validateXxx> 多字段验证器并非旨在引用多次呈现的单个组件。唯一这样做的 OmniFaces 验证器是 <o:validateUniqueColumn>

    如果您想在基于集合的动态输入上使用<o:validateXxx> 多字段验证器,那么最好的选择是使用JSTL <c:forEach>。它将在物理上构建多个组件。

    例如

    <c:forEach items="#{bean.items}" var="item" varStatus="loop">
        <h:inputText id="input_#{loop.index}" value="#{item.value}" />
    </c:forEach>
    

    假设有 3 个项目,这将动态创建 ID 为 input_0input_1input_2 的 JSF 组件。然后你可以像下面这样使用&lt;o:validateXxx&gt;(把它放在循环之外!)

    <o:validateAllOrNone components="input_0 input_1 input_2" />
    

    您可以将上面示例中的硬编码字符串替换为 EL 表达式,该表达式从支持 bean 返回所需的空格分隔的组件 ID 字符串。

    <o:validateAllOrNone components="#{bean.inputIds}" />
    

    另一种方法是自己创建&lt;x:validateAllOrNoneColumn&gt; 或在 OmniFaces 问题跟踪器上发布增强请求。改变现有的&lt;o:validateAllOrNone&gt; 需要一个完全独立的组件并不是一件容易的事。

    【讨论】:

    • 啊好的,谢谢,所以我认为最好的方法是使用这种 c:foreach 方法...
    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 2017-09-21
    • 2011-02-01
    • 2012-03-08
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多