【问题标题】:Setting an ID on JSF component inside JSTL c:forEach causes duplicate ID exception在 JSTL c:forEach 内的 JSF 组件上设置 ID 会导致重复 ID 异常
【发布时间】:2013-09-12 21:47:59
【问题描述】:

我有一个 primefaces treeTable 并另外使用 c:forEach 创建动态列。 有没有办法从另一个表单中识别 c:forEach 中的那些列? (如果我在 c:forEach 中为我的列设置了一个 id,我会得到一个重复的 ID 错误)

<h:form id="mmvUebersicht">
<p:treeTable id="massnahmenUebersichtTable"
            value="#{mmvOrganisationseinheitenTreeHandler.root}"
            var="_tree"
            selection="#{mmvOrganisationseinheitenTreeHandler.selectedNode}"
            selectionMode="single"
            scrollable="true"
            scrollHeight="500">

            <p:ajax event="expand" listener="#{mmvOrganisationseinheitenTreeHandler.onNodeExpand}" />
            <ui:remove>
            <p:ajax event="select" update=":mmvUebersichtEastForm" listener="#{mmvOrganisationseinheitenTreeHandler.onNodeSelect}" />
            </ui:remove>

        <p:column headerText="#{labels.abteilung}" style="width:250px">
            <p:outputLabel value="#{_tree.id} #{_tree.shortNameName}"/>
        </p:column>

        <p:column headerText="#{labels.funktion}" style="width:150px">
            <p:outputLabel value="#{structureNodeHandler.getAttributeCommentByAttributeType(_tree, 'Leitung')}" />
        </p:column>
        <p:column headerText="#{labels.verantwortlich}" style="width:150px">
            <p:outputLabel value="#{mmvHelper.getUserByRacf(structureNodeHandler.getAttributeValueByAttributeType(_tree, 'Leitung'))}"/>            
        </p:column>

        <c:forEach items="#{massnahmenDefintionListHandler.defList}"
                    var="_mass"
                    >
            <p:column style="width:50px">
            <f:facet name="header">
                <p:outputLabel value="#{_mass.kurzName}" title="#{mass.name}"/>
            </f:facet>    

              <p:commandLink onclick="mmvlayout.show('east')"
                            update=":mmvContentPanelEast :mmvUebersichtEastForm" 
                            action="#{mmvHandler.fillUebersichtEastPanel(_tree,_mass)}"
                            rendered="#{massnahmenErfuellungsObjekt.abteilungHasMassnahme(_tree,_mass,true)}">
                <h:outputText value="#{massnahmenErfuellungsObjekt.bestimmeMassnahmenFaelligkeiten(_tree,_mass,true)}" 
                            styleClass="#{massnahmenErfuellungsObjekt.cellColor()} statusBar"/>
              </p:commandLink>


            </p:column>

        </c:forEach>

        <p:column style="width:*"></p:column>

</p:treeTable>

【问题讨论】:

    标签: jsf primefaces datatable jstl


    【解决方案1】:

    如果我在 c:forEach 中为我的列设置 ID,我会收到重复 ID 错误\

    这是因为&lt;c:forEach&gt; 在 JSF 组件树中物理上生成了多个 JSF 组件,而不是一个在生成 HTML 输出期间又被多次重用的 JSF 组件。有关工作的详细说明,请参阅 JSTL in JSF2 Facelets... makes sense?

    在这种情况下,您需要自行负责在这些 JSF 组件上设置唯一 ID。您可以使用当前的迭代索引。

    <c:forEach ... varStatus="loop">
        <p:commandLink id="link_#{loop.index}" ...>
    

    【讨论】:

    • 感谢 BalusC。有趣的是,如何在不同的表单中获取 loop.index 并使用该循环索引向该列发送更新请求?
    • JSTL 循环索引在这种情况下不是问题,它应该可以正常工作,因为它存在于 JSF 组件树(UIViewRoot#findComponent() 能够返回正确的东西)以及HTML DOM 树(document.getElementById() 能够在该客户端 ID 上找到正确的东西)。但是,在这种情况下,问题在于&lt;p:dataTable&gt; 自己的索引(:0:1 等前缀)。这在 JSF 组件树中不存在。所以你仍然需要更新整个 &lt;p:dataTable&gt; 东西(或者用另一个 &lt;c:forEach&gt;... :X 替换它)
    • 嗯,我想我明白你的意思了。如果我必须更新整个 treeTable,我将不得不缓存或存储哪些节点展开,哪些不展开。我认为这对我来说是很多工作;-)
    • 问题已解决;-)。我刚刚在我的 TreeHandler bean 中添加了一个 TreeNodes 列表,我在其中存储了那些展开的节点。在更新整个树的过程中,我只检查列表,如果它包含我的节点,如果为真,我设置扩展 =真,否则不。
    猜你喜欢
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    相关资源
    最近更新 更多