必需属性中的布尔表达式

时间:2012-12-10 10:28:03

标签: java jsf primefaces el

是否可以使用布尔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执行此操作,还是应该实现自定义验证程序?

2 个答案:

答案 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验证器,虽然我还没有使用它。

爱德华