我有一个以下测试复合组件:
<composite:interface>
<composite:clientBehavior event="click" targets="#{cc.clientId}:label"
name="click" />
</composite:interface>
<composite:implementation>
<h:outputLabel value="click here" id="label" style="background-color: red" />
</composite:implementation>
当我使用它时附加f:ajax客户端行为我的侦听器方法不在服务器端调用,但POST请求到达服务器。我注意到,当我没有指定f:ajax的execute属性或将其指定为“@this”时,不会调用侦听器,但是使用execute =“@ form”或“@all”它可以工作。
这些示例不起作用:
<h:form>
<t:testComposite>
<f:ajax event="click" listener="#{bean.test}" />
</t:testComposite>
</h:form>
<h:form>
<t:testComposite>
<f:ajax event="click" listener="#{bean.test}" execute="@this"/>
</t:testComposite>
</h:form>
这些例子有效:
<h:form>
<t:testComposite>
<f:ajax event="click" listener="#{bean.test}" execute="@form" />
</t:testComposite>
</h:form>
<h:form>
<t:testComposite>
<f:ajax event="click" listener="#{bean.test}" execute="@all" />
</t:testComposite>
</h:form>
<h:form id="form">
<h:panelGroup id="group">
<t:testComposite>
<f:ajax event="click" listener="#{bean.test}" execute=":form:group" />
</t:testComposite>
</h:panelGroup>
</h:form>
我在tomcat 7上使用myfaces 2.1.12和jboss as7使用mojarra 2.1.18进行了测试。
我的问题是:为什么f:ajax在附加到复合组件时使用execute =“@ this”?
答案 0 :(得分:0)
目标的基础是隐式的,因此target =“#{cc.clientId}:label”不是必需的。你应该使用targets =“label”代替。
很难解释,但是target =“#{cc.clientId}:label”不起作用的原因是因为EL表达式是在上下文中计算的,或者是在构建组件树之前计算的,所以在例如,在尝试派生父组件时,子组件尚未附加到视图中。
一般规则是当facelet构建树时(例如在facelet TagHandler中)调用getClientId(),而是使用附加到PostAddToViewEvent的侦听器。