f:ajax 渲染引用迭代组件



我有以下结构的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>

最新更新