如何在复合组件内动态重复内寻址组件

问题描述 投票:0回答:1

在处理

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:找不到从“form:incrementBtn”引用的表达式“form:testComp:repeat:0:repeat-item”的组件。

以下星座工作没有问题:

  • 没有复合组件(例如一个文档或包含或标签库)
<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>
  • 不使用复合组件属性
<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"/>
  • 将按钮放在 cc 标签后面
<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"/>

我的真实用例是通过对话框中的按钮更新复合组件内重复的特定面板。 我遇到了同样的错误。

在调试和尝试不同的想法和解决方案时,我偶然发现了上述行为。

  • 这是预期的行为吗?

  • “何时”我可以使用

    来寻址组件

    “表单:testComp:重复:0:重复项目”

    例如:是否存在规则或预期的元素顺序?

注意:“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:找不到从“form:incrementBtn”引用的表达式“testComp:repeat:0:repeat-item”的组件。

jsf composite-component uirepeat
1个回答
0
投票

这是稍微复杂一点的对话框示例:

<comb:testComp id="testComp" dummyList="#{testBean.dummyList}"/>

<p:dialog id="testDlg" widgetVar="testDlg" dynamic="true">

  <p:commandButton id="incrementBtn" value="Increment (component)"
                   action="#{testBean.incrementState()}"
                   process="@this"
                   update="#{testBean.panelId}"/>
</p:dialog>
<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 id="repeatPanel">
                    <h:outputText id="repeat-item" value="#{component.clientId} / #{testBean.state}"/>

                    <p:commandButton id="openDlgBtn" value="Open dialog"
                                     action="#{testBean.prepareDialog(component.parent.clientId)}"
                                     process="@this"
                                     update="form:testDlg"/>
                </p:outputPanel>
            </ui:repeat>
        </div>
    </cc:implementation>
</ui:component>

错误:org.primefaces.expression.ComponentNotFoundException:找不到从“form:incrementBtn”引用的表达式“form:testComp:repeat:1:repeatPanel”的组件。

它仅适用于对话框中的

dynamic=false

© www.soinside.com 2019 - 2024. All rights reserved.