如何定位复合组件内ui:repeat动态迭代中的组件
JSF复合组件内ui:repeat组件定位问题
在JSF开发中,我遇到了无法定位复合组件内、遍历其属性集合的ui:repeat中组件的问题,具体场景和代码如下:
复合组件代码
<ui:component> <cc:interface> <cc:attribute name="dummyList" /> </cc:interface> <cc:implementation> <div id="#{cc.clientId}"> <ui:repeat id="repeat" value="#{cc.attrs.dummyList}" var="d"> <p:outputPanel> <h:outputText id="repeat-item" value="#{component.clientId} / #{testBean.state}"/> </p:outputPanel> </ui:repeat> </div> </cc:implementation> </ui:component>
无法正常工作的写法
<p:commandButton value="Increment (component)" action="#{testBean.incrementState()}" process="@this" update="form:testComp:repeat:0:repeat-item"/> <comb:testComp id="testComp" dummyList="#{testBean.dummyList}"/>
报错信息:
org.primefaces.expression.ComponentNotFoundException: Cannot find component for expression "form:testComp:repeat:0:repeat-item" referenced from "form:incrementBtn".
可正常运行的场景
- 场景1:不使用复合组件(单文档、include或taglib)
<p:commandButton id="incrementBtn" value="Increment" action="#{testBean.incrementState()}" process="@this" update="form:repeat:0:repeat-item"/> <ui:repeat id="repeat" value="#{testBean.dummyList}" var="d"> <p:outputPanel> <h:outputText id="repeat-item" value="#{component.clientId} / #{testBean.state}"/> </p:outputPanel> </ui:repeat>
- 场景2:不使用复合组件属性
复合组件代码:
<ui:component> <cc:implementation> <div id="#{cc.clientId}"> <ui:repeat id="repeat" value="#{testBean.dummyList}" var="d"> <p:outputPanel> <h:outputText id="repeat-item" value="#{component.clientId} / #{testBean.state}"/> </p:outputPanel> </ui:repeat> </div> </cc:implementation> </ui:component>
页面代码:
<p:commandButton id="incrementBtn" value="Increment (component)" action="#{testBean.incrementState()}" process="@this" update="form:testComp:repeat:0:repeat-item"/> <comb:testComp id="testComp"/>
- 场景3:将按钮放在复合组件标签之后
<comb:testComp id="testComp" dummyList="#{testBean.dummyList}"/> <p:commandButton id="incrementBtn" value="Increment (component)" action="#{testBean.incrementState()}" process="@this" update="form:testComp:repeat:0:repeat-item"/>
实际场景与疑问
我的实际场景是从对话框中的按钮更新复合组件内repeat中的特定面板,同样触发上述错误。
我有两个疑问:
- 这是预期行为吗?
- 何时可以使用表达式
form:testComp:repeat:0:repeat-item定位组件?是否有元素顺序规则?
补充说明:"form"为外层表单元素的ID。有趣的是,省略"form:"的写法同样无法工作:
<comb:testComp id="testComp" dummyList="#{testBean.dummyList}"/> <p:commandButton id="incrementBtn" value="Increment (component)" action="#{testBean.incrementState()}" process="@this" update="testComp:repeat:0:repeat-item"/>
报错信息:
org.primefaces.expression.ComponentNotFoundException: Cannot find component for expression "testComp:repeat:0:repeat-item" referenced from "form:incrementBtn".
内容的提问来源于stack exchange,提问作者stackisfull
相关产品推荐
相关产品推荐

