我注意到我正在编写的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>
如何阻止侦听器自行触发?
答案 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
而没有实际评估它。