加载视图时会调用侦听器

时间:2014-01-27 18:07:55

标签: jsf primefaces spring-webflow composite-component

我注意到我正在编写的Primefaces 3.5应用程序的奇怪行为。我正在调试我的代码,事实证明当我使用jsf组件并尝试传递这样的监听器时

           <form:dictionarySelectInput id="country"
                                        name="country"
                                        label="label.claim.BelongingsSecondPage.property.country"
                                        filter="true"
                                        value="#{belongingsDataGatheringBean.page.belongingsSection.propertyBelonging.country}"
                                        items="#{belongingsDataGatheringBean.dictionaries.countryDictionary()}"
                                        listener="#{belongingsDataGatheringBean.changeCountryListener()}"
                                        update="@([id$=state\\:state-panel])"/>

然后在渲染视图期间,该方法被自己调用。以下是组件如何使用侦听器:

    <p:selectOneMenu id="#{cc.attrs.name}-input" value="#{cc.attrs.value}" styleClass="select #{cc.attrs.styleClass}" filter="#{cc.attrs.filter}" converter="omnifaces.SelectItemsConverter">
        <f:selectItem itemLabel="#{msg['common.select.empty']}" noSelectionOption="true"/>
        <f:selectItems value="#{cc.attrs.items}" var="item" itemLabel="#{item.value}" itemValue="#{item}"/>
        <c:choose>
            <c:when test="${empty cc.attrs.listener}">
                <p:ajax disabled="#{empty cc.attrs.update}" process="@this" listener="#{cc.attrs.listener}" update="#{cc.attrs.update}"/>
            </c:when>
            <c:otherwise>
                <p:ajax disabled="#{empty cc.attrs.update}" process="@this" update="#{cc.attrs.update}"/>
            </c:otherwise>
        </c:choose>
    </p:selectOneMenu>

如何阻止侦听器自行触发?

1 个答案:

答案 0 :(得分:0)

这是不对的:

<c:when test="${empty cc.attrs.listener}">

此处#{cc.attrs.listener}被评估为ValueExpression,以便满足empty检查。因此,执行整个EL表达式就好像它是一个属性,并且调用EL后面的(getter)方法并将其结果返回到empty检查。

您需要按以下方式检查:

<c:when test="#{cc.getValueExpression('listener') != null}">

这不会执行EL表达式,只是检查是否存在ValueExpression而没有实际评估它。

另见: