【问题标题】:<f:ajax render> not working via <composite:clientBehavior><f:ajax render> 不能通过 <composite:clientBehavior> 工作
【发布时间】:2014-07-11 07:46:58
【问题描述】:

我有一个包含 ajax 的复合组件:

<composite:interface>
    <composite:attribute name="question" required="true"/>
    <composite:attribute name="value" required="false"/>
    <composite:attribute name="id" required="true" />
    <composite:clientBehavior name="alter" 
        event="change" targets="input"/>
</composite:interface>
<composite:implementation>
    <label for="#{cc.attrs.id}">
        <h:outputText value="#{cc.attrs.question}" />
    </label>
    <div class="fld">      
        <h:selectOneRadio value="#{cc.attrs.value}" id="input">
            <f:selectItem itemValue="true" itemLabel="Yes" />
            <f:selectItem itemValue="false" itemLabel="No" />
        </h:selectOneRadio>
    </div>
</composite:implementation>

当我在我的页面中使用这个复合组件时:

<question:yesNo question="#{myMSG['knowRegQuestion']}" value="#{vehicle.regKnown}" id="is-reg-known">
    <f:ajax event="alter" render="reg-unknown" />
</question:yesNo>
......
<h:panelGroup id="reg-unknown" styleClass="questionGroup man-veh-srch">
    ......
    <h:selectOneListbox value="#{vehicle.model}" size="1" rendered="#{vehicle.regKnown eq 'true'}">
        ......
    </h:selectOneListbox>
</h:panelGroup>

ajax 正在触发,模型正在正确更新,但渲染没有改变。 (我尝试过各种 EL 表达式)此外,ajax 响应在 firebug 中看起来也不正确:

<?xml version='1.0' encoding='UTF-8'?>
<partial-response id="j_id1"><changes><update id="j_id1:javax.faces.ViewState:0"><![CDATA[-2911901889097730230:4227240037100614528]]></update></changes></partial-response>

我错过了什么? (谢谢)

【问题讨论】:

    标签: ajax jsf-2.2 composite-component


    【解决方案1】:

    &lt;f:ajax render&gt; 中指定的任何相对客户端 ID 都相对于组件树中的父 ClientBehaviorHolder 组件进行解析。在您的特定情况下,这实际上是&lt;h:selectOneRadio&gt;。因此,在与 &lt;h:selectOneRadio&gt; 相同的命名容器父级中寻找具有客户端 ID reg-unknown 的组件,即&lt;cc:implementation&gt; 本身(您可能已经知道复合组件实现了NamingContainer)。但是,所需的组件不在其中。

    您最好指定一个绝对客户端 ID(因此,以 : 开头,以便相对于 UIViewRoot 查找它)。您可以通过两种通用方式实现此目的:

    1. 对其进行硬编码(假设这一切都在一个 ID 为 form 的表单中):

      <h:form id="form">
          <question:yesNo ...>
              <f:ajax event="alter" render=":form:reg-unknown" />
          </question:yesNo>
          ...
          <h:panelGroup id="reg-unknown" ...>
              ...
          </h:panelGroup>
      </h:form>
      
    2. 参考UIComponent#getClientId()(如果父命名容器的 ID 未知):

      <h:form ...>
          <question:yesNo ...>
              <f:ajax event="alter" render=":#{regUnknown.clientId}" />
          </question:yesNo>
          ...
          <h:panelGroup binding="#{regUnknown}" ...>
              ...
          </h:panelGroup>
      </h:form>
      

    这确实很尴尬。这曾经被报告为 Mojarra issue 1510,但他们并不认为这是一个错误,因为复合组件本身不应该知道关于复合组件之外的其他组件的任何信息(尽管解决方案在理论上很简单:如果&lt;f:ajax render&gt; 不以:@ 开头,然后在其前面加上复合组件父级的客户端ID。

    【讨论】:

      猜你喜欢
      • 2013-03-25
      • 2011-08-31
      • 2023-03-12
      • 1970-01-01
      • 2018-04-13
      • 2023-03-25
      • 2011-09-29
      • 2011-12-31
      • 1970-01-01
      相关资源
      最近更新 更多