【问题标题】:boolean expression in required attribute必需属性中的布尔表达式
【发布时间】:2012-12-10 10:28:03
【问题描述】:

是否可以用布尔 EL 表达式填充 required 属性的值? 我有一个表单,其中仅当描述输入 (descInput) 不为空时才需要数量输入 (qtyInput)。我试着这样做:

<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 来执行此操作,还是应该实现自定义验证器?

【问题讨论】:

    标签: java jsf primefaces el


    【解决方案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}" />
    

    【讨论】:

    • 正如您所说,这是(我对)JSF 生命周期的问题。谢谢。
    【解决方案2】:

    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 中输入的任何内容都会在修改 itemDescription 后重置为 bean 的值(如果是这种情况,则为无值)。 另外,也许你可以使用 BalusC 的omnifaces 库,它提供了一些 validateAllOrNone 验证器,虽然我还没有使用过。

    爱德华

    【讨论】:

    • OmniFaces 没有为此提供解决方案。 OP的方法很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多