是否可以使用布尔EL表达式填充required
属性的值?
我有一个表单,只有在描述输入(qtyInput
)不为空时才需要数量输入(descInput
)。我试着这样做:
<h:form id="form">
<p:dataTable var="item" value="#{someController.list}" id="table">
<p:column>
<f:facet name="header" >
<h:outputText value="Description"/>
</f:facet>
<p:inputText value="#item.description}" id="descInput" />
<p:message for="descInput" />
</p:column>
<p:column>
<f:facet name="header" >
<h:outputText value="Quantity"/>
</f:facet>
<p:inputText value="#{item.quantity}" required="#{not empty item.description}" id="qtyInput"/>
<p:message for="qtyInput" />
</p:column>
</p:dataTable>
<p:commandButton id="saveButton" value="Save" action="#{someController.save()}"/>
</h:form>
但它不起作用。是否可以仅使用EL执行此操作,还是应该实现自定义验证程序?
答案 0 :(得分:1)
是的,有可能。你的问题只是错误的时机造成的。在您当前的尝试中,
<p:inputText ... value="#{item.description}" />
<p:inputText ... value="#{item.quantity}" required="#{not empty item.description}" />
#{item.description}
仅在更新模型值阶段设置,而required
属性在验证阶段(即之前的一个阶段)进行评估。因此,您正在检查当时尚未提供的值。
您需要检查组件的值而不是模型值。您可以通过将组件绑定到视图然后访问UIInput#getValue()
来获取它。
<p:inputText ... binding="#{descComponent}" value="#{item.description}" />
<p:inputText ... value="#{item.quantity}" required="#{not empty descComponent.value}" />
请注意,组件按照它们在组件树中出现的顺序进行处理,因此如果您反过来具有上述组件,那么它也会失败。您需要通过UIInput#getSubmittedValue()
检查组件的提交值。
<p:inputText ... value="#{item.quantity}" required="#{not empty descComponent.submittedValue}" />
<p:inputText ... binding="#{descComponent}" value="#{item.description}" />
答案 1 :(得分:0)
BalusC写的替代方法是使用PrimeFaces p:ajax
<p:inputText ...id="itemDescription" value="#{item.description}">
<p:ajax event="blur" partialSubmit="true" update="itemQuantity" />
</input>
<p:inputText ...id="itemQuantity" value="#{item.quantity}" required="#{not empty item.description}" />
它看起来很优雅,唯一的缺点是无论在itemQuantity中输入什么,它都会被重置为bean&#39;修改itemDescription后的值(如果是这样的话,则为无值)。 也许你可以使用BalusC的库omnifaces,它提供了一些validateAllOrNone验证器,虽然我还没有使用它。
爱德华