在处理
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"/>
<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”的组件。
这是稍微复杂一点的对话框示例:
<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
。