我们已经构建了以下复合组件,但是我们还没有找到一种方法来使其重新渲染组件外部元素。
<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');" />
遗憾的是,没有执行任何指定的操作。