1

我们已经构建了以下复合组件,但是我们还没有找到一种方法来使其重新渲染组件外部元素。

 <h:panelGroup id="#{cc.attrs.id}Cmtp" rendered="#{cc.attrs.rendered}">
      <div id="#{cc.attrs.id}" class="xyz-select #{cc.attrs.styleClass}" >
        <h:inputText id="input" disabled="#{cc.attrs.disabled}"
          value="#{cc.attrs.value}"
          tabindex="#{cc.attrs.tabindex}" maxlength="#{cc.attrs.maxlength}" 
          converter="#{cc.attrs.converter}">
          <a4j:ajax event="change" render="select" />        
        </h:inputText>
        <rich:select disabled="#{cc.attrs.disabled}"
          id="select" value="#{cc.attrs.value}"
          listWidth="#{cc.attrs.listWidth}"
          converter="#{cc.attrs.converter}">          
          <f:selectItems value="#{cc.attrs.items}" var="xyz"
            itemValue="#{xyz}" itemLabel="#{xyz.name}" />
          <a4j:ajax event="selectitem" render="input" />            
        </rich:select>
        </div>        
      </h:panelGroup>

我尝试添加一个定义要重新渲染的外部元​​素的属性,但这只是出现了一条错误消息,即 id 不在组件的范围内。

复合组件:

<a4j:ajax event="change" render="select #{cc.attrs.render}" />  

定义:

<xyz:selct ... render="idA idB" />

我还尝试通过在界面中公开 clientBehavior 来传递给它。

复合组件接口:

<composite:clientBehavior name="change" event="action" /> 

定义:

<xyz:select ..>
   <a4j:ajax event="change" rerender="idA idB" />
</xyz:select>

然而,这只是停止了组件的所有 ajax 功能。

根据 BalusC 的建议(谢谢),我尝试了以下方法:

<composite:interface>
...
<composite:clientBehavior name="change" event="action" targets="input select"/>  
</composite:interface>

并尝试将以下 AJAX 标记传递给它:

<a4j:ajax event="change" render="idA idB" oncomplete="alert('tada');" />

遗憾的是,没有执行任何指定的操作。

4

1 回答 1

4

相对客户端 ID(即不以 开头:)是相对于当前NamingContainer组件(例如<h:form><h:dataTable><cc:implementation>等)解析的。

因此,如果您的复合材料中有以下行,

<a4j:ajax event="change" render="select #{cc.attrs.render}" />  

it's been 是相对于<cc:implementation>. 但是,没有带有 ID 的组件,idA也没有idB<cc:implementation>.

您需要指定一个绝对客户端 ID。例如

<xyz:selct ... render=":formId:idA :formId:idB" />

也可以看看:


至于<cc:clientBahavior>失败,缺少上下文/ SSCCE,但我相信这仅仅是因为您忘记了execute属性和错误输入的render属性。

于 2013-08-12T12:11:41.243 回答