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