是否可以在<o:validateAllOrNone>
或<ui:repeat>
内使用OmniFaces <h:dataTable>
(这很酷;)?
我需要一个表,每行都有一个输入字段列。您可以填写这些值或全部值。
如果我将<o:validateAllOrNone>
放在<ui:repeat>
或<h:dataTable>
中并使用components
属性中输入字段的ID,那么验证器也会被触发,如果全部字段是空的。
答案 0 :(得分:0)
不,那是不可能的。 components
属性必须物理上引用多个组件,而不是多次呈现的单个组件。然而,它可以用在物理上多个组件上,这些组件在相同的迭代轮次期间呈现。 <o:validateXxx>
多字段验证程序不是为了引用多次呈现的单个组件而设计的。唯一能做到这一点的OmniFaces验证器是<o:validateUniqueColumn>
。
如果要根据集合对动态输入使用<o:validateXxx>
多字段验证器,那么最好的办法是使用JSTL <c:forEach>
。它将物理构建多个组件。
E.g。
<c:forEach items="#{bean.items}" var="item" varStatus="loop">
<h:inputText id="input_#{loop.index}" value="#{item.value}" />
</c:forEach>
假设有3个项目,这将动态创建ID为input_0
,input_1
和input_2
的JSF组件。然后你可以按如下方式使用<o:validateXxx>
(把它放在循环之外!)
<o:validateAllOrNone components="input_0 input_1 input_2" />
您可以通过EL表达式替换上面示例中的硬编码字符串,该表达式从辅助bean返回所需的空格分隔的组件ID字符串。
<o:validateAllOrNone components="#{bean.inputIds}" />
另一种方法是自己创建<x:validateAllOrNoneColumn>
或在OmniFaces问题跟踪器上发布增强请求。改变现有的<o:validateAllOrNone>
并不需要完全独立的组件。