Jsf f:ajax渲染引用迭代组件

Jsf f:ajax渲染引用迭代组件,jsf,myfaces,websphere-portal,Jsf,Myfaces,Websphere Portal,我有以下结构的xhtml: <h:form id="frmMain2"> <f:subview id="sub1"> <ui:repeat var="vatId" value="#{someBean.suppliesKeys()}" id="rep1"> <fieldset> <legend>vatId</legend&

我有以下结构的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>
请注意,我试图在f:ajax渲染(:frmMain2:sub1:rep1:0:panel)中引用面板的第一次迭代

若我引用了其他内容(在迭代部分之外),例如:frmMain2:sub1:rep1,那个么就会找到组件,portlet就会工作

我找不到如何在“渲染属性”中引用某个迭代组件

在下面的帖子中,这个问题在Mojarra更新版本中被描述为已解决,但Myfaces 2.2.7并没有解决这个问题:


那么,有没有一种方法可以引用我想在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>

梵蒂德
${item}
然后您可以硬编码第一个选项。下面是一些示例代码(由于我没有关于您的模型数据的所有信息,您肯定需要调整此代码)

<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>


有比2.2.7(2.2.12)更新的版本,尝试过吗?我喜欢你的思维方式和你如何将第一个选项隔离开来。但是,我不需要硬编码的第一个选项。我在示例中这样做只是为了证明语法无效。实际呈现的面板应该是单击的commandLink的父级面板,但却是ui:repeat的子级面板。我考虑使用varStatus中的索引,而不是我将添加到ui:repeat中的零(但如果零不起作用,我就不需要正确的索引)
<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>