6

我有一个具有MethodExpression属性的复合组件变更侦听器:

<复合:界面><composite:attribute name=“changeListener”required=“false”method-signature=“void actionListener(javax.faces.event.ActionEvent)”/>..</复合:接口><复合:实现><p:remoteCommand name=“ajaxOnChange”update=“#{cc.attrs.onChangeUpdate}”oncomplete=“#{cc.attrs.onchange}”actionListener=“#{cc.attrs.changeListener}”/>..</composite:实现>

这个changeListener(更改侦听器)属性是一个可选的方法表达式,用作actionListener(操作侦听器)远程命令我想渲染<p:remoteCommand>仅当changeListener(更改侦听器)属性已设置。

我尝试了几种方法来检查属性是否已设置,尤其是:

<c:if test=“#{!empty cc.attrs.changeListener}”>

<p:remoteCommand rendered=“#{cc.attrs.changeListener!=null}”/>

但我得到了javax.el.属性未找到异常因为它尝试将属性作为属性进行计算。

如何评估是否设置了可选方法属性?

1个答案1

重置为默认值
9

你的方向是正确的<c:if>已经。这个提供一个是永远不会起作用的。你只需要检查一下生的EL表达式设置,而不是将整个EL表达式作为值表达式进行实际求值,并检查其结果是否不为空,如果EL表达式表示方法表达式,这当然会失败。

<c:if test=“#{not empty cc.getValueExpression('changeListener')}”>...</c:if>

然而,这个解决方案有点吓人:您在这里将方法表达式作为值表达式。然而,只要您不实际计算所附的EL表达式(如您的初始值#{cc.attrs.changeListener}尝试在幕后进行),那么就没什么大不了的了。不幸的是,没有其他干净的方式UI组件#getMethodExpression()在Faces API中。

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.