2

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

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

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

4

1 回答 1

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_1和的 JSF 组件input_2。然后你可以<o:validateXxx>按如下方式使用(把它放在循环之外!)

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

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

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

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

于 2013-05-27T16:05:38.487 回答