You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定位复合组件内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中的特定面板,同样触发上述错误。

我有两个疑问:

  1. 这是预期行为吗?
  2. 何时可以使用表达式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 18:15:59