JSF f:与复合组件一起使用时未调用的ajax侦听器并执行=“@ this”

时间:2013-11-28 17:08:37

标签: ajax jsf-2 composite-component

我有一个以下测试复合组件:

<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”?

1 个答案:

答案 0 :(得分:0)

目标的基础是隐式的,因此target =“#{cc.clientId}:label”不是必需的。你应该使用targets =“label”代替。

很难解释,但是target =“#{cc.clientId}:label”不起作用的原因是因为EL表达式是在上下文中计算的,或者是在构建组件树之前计算的,所以在例如,在尝试派生父组件时,子组件尚未附加到视图中。

一般规则是当facelet构建树时(例如在facelet TagHandler中)调用getClientId(),而是使用附加到PostAddToViewEvent的侦听器。