在组件外部元素上传递<a4j:ajax ... =“”>渲染</a4j:ajax>

时间:2013-08-12 08:49:13

标签: ajax jsf jsf-2 composite-component

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

 <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');" />

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

1 个答案:

答案 0 :(得分:3)

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

因此,如果您的合成中包含以下行,

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

相对于<cc:implementation>搜索了它。但是,idA中没有ID idB<cc:implementation>的组件。

您需要指定绝对客户端ID。 E.g。

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

另见:


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