我有以下结构的xhtml:
<h:form id="frmMain2">
<f:subview id="sub1">
<ui:repeat var="vatId" value="#{someBean.suppliesKeys()}" id="rep1">
<fieldset>
<legend>vatId</legend>
<h:panelGroup id="panel">
<ui:repeat var="item" value="#{someBean.supplies[vatId]}" id="rep2">
<f:subview id="sub2">
<h:commandLink id="command">
${item}
<f:ajax
event="click"
render=":frmMain2:sub1:rep1:0:panel">
</f:ajax>
</h:commandLink>
</f:subview>
</ui:repeat>
</h:panelGroup>
</fieldset>
</ui:repeat>
</f:subview>
</h:form>
这是通过 Portlet 桥在 Websphere Portlet 中运行的,这意味着我被 Myfaces 2.0 困住了。
我面临的问题是我收到以下错误:
javax.portlet.PortletException: Component with id::frmMain2:sub1:rep1:0:panel not found
请注意,我正在尝试在 f:ajax 渲染中引用面板的第一次迭代(:frmMain2:sub1:rep1:0:p anel)。
如果我引用了其他内容(在迭代部分之外),例如:frmMain2:sub1:rep1,则找到组件并且Portlet可以工作。
我找不到如何在渲染属性中引用一些迭代组件。
在以下帖子中找到此问题在Mojarra较新版本中被描述为已解决,但是Myfaces 2.2.7无法解决问题:如何找出ajax更新/渲染组件的客户端ID?找不到从"bar"引用表达式"foo"的组件
那么,有没有办法引用我想在 f:ajax 中渲染的组件?
由于您只想呈现第一次迭代,因此您可以创建自定义组件、标记或模板来封装要迭代的组件作为解决方法:
<fieldset>
<legend>vatId</legend>
<h:panelGroup id="panel">
<ui:repeat var="item" value="#{someBean.supplies[vatId]}" id="rep2">
<f:subview id="sub2">
<h:commandLink id="command">
${item}
<f:ajax
event="click"
render=":frmMain2:sub1:rep1:0:panel">
</f:ajax>
</h:commandLink>
</f:subview>
</ui:repeat>
</h:panelGroup>
</fieldset>
然后,您可以对第一个选项进行硬编码。下面是一些示例代码(您肯定需要对其进行调整,因为我没有有关您的模型数据的所有信息):
<h:form id="frmMain2">
<f:subview id="sub1">
<custom:component id="first" items="#{someBean.supplies[hardcodedFirstKey]}">
<f:ajax event="click" render="@this" />
</custom:component>
<ui:repeat var="vatId" value="#{someBean.suppliesKeys()}" id="rep1">
<custom:component items="#{someBean.supplies[vatId]}" rendered="#{!key eq hardcodedFirstKey}">
<f:ajax event="click" render=":frmMain:sub1:first" />
</custom:component>
</ui:repeat>
</f:subview>
</h:form>