我有一个带有MethodExpression属性changeListener
的UI组件:
<composite:interface>
<composite:attribute name="changeListener" required="false" method-signature="void actionListener(javax.faces.event.ActionEvent)" />
..
</composite:interface>
<composite:implementation>
<p:remoteCommand name="ajaxOnChange"
update="#{cc.attrs.onChangeUpdate}"
oncomplete="#{cc.attrs.onchange}"
actionListener="#{cc.attrs.changeListener}" />
..
</composite:implementation>
此changeListener
属性是remoteCommand
中用作 actionListener 的可选方法表达式,我想仅在<p:remoteCommand>
时呈现changeListener
}属性已设置。
我尝试了几种检查属性是否设置的方法,尤其是:
<c:if test="#{! empty cc.attrs.changeListener}">
和
<p:remoteCommand rendered="#{cc.attrs.changeListener != null}" />
但是我得到了一个javax.el.PropertyNotFoundException,因为它试图将该属性评估为属性。
如何评估是否设置了可选方法属性?
感谢
答案 0 :(得分:9)
您已经使用<c:if>
朝着正确的方向前进了。 rendered
一个永远不会起作用。您只需要检查是否已设置EL expression而不是实际将整个EL表达式作为值表达式进行计算并检查其结果是否为空,如果EL表达式表示方法表达式,这当然会失败。
<c:if test="#{not empty cc.getValueExpression('changeListener')}">
...
</c:if>
然而,这个解决方案有些可怕:你在这里将方法表达式作为值表达式。但是,只要您实际上没有评估所附的EL表达式(就像您的初始#{cc.attrs.changeListener}
尝试所做的那样),那么就没有任何意义。没有其他干净的方法,因为JSF API中没有UIComponent#getMethodExpression()
。