丰富的数据表不能将迭代变量用于嵌套循环

Posted

技术标签:

【中文标题】丰富的数据表不能将迭代变量用于嵌套循环【英文标题】:rich dataTable can not use iterate variable for a nested loop 【发布时间】:2013-04-29 23:24:22 【问题描述】:

我正在构建一个包含动态列数的丰富数据表。在我看来,这不是一件大事,但我试图从几个小时内得到答案。 问题是当我想将数据表中的迭代变量用于嵌套循环时。在嵌套循环中,我尝试为每一行创建相同的动态列数。 当我显示一些代码时可能会变得更清楚:

<rich:dataTable styleClass="waiDataTable" 
rowClasses="odd,even" value="#reportingModel.reportingDoiPoolRows"
var="reportingDoiPoolRow"
rendered="#not empty reportingModel.reportingDoiPoolRows">

<!-- Start header of the data-table -->
<f:facet name="header">
    <rich:columnGroup>

        <rich:column rowspan="2">
            <h:outputText value="Pool" />
        </rich:column>

        <c:forEach items="#reportingModel.headerList" var="item">
            <rich:column colspan="2">
                <h:outputText value="#item" />
            </rich:column>
        </c:forEach>

        <rich:column breakRowBefore="true">
            <h:outputText value="New" />
        </rich:column>
        <rich:column>
            <h:outputText value="Tot" />
        </rich:column>

        <c:forEach begin="1" end="#reportingModel.headerList.size()-1">
            <rich:column>
                <h:outputText value="New" />
            </rich:column>
            <rich:column>
                <h:outputText value="Tot" />
            </rich:column>
        </c:forEach>

    </rich:columnGroup>
</f:facet>
<!-- End header of the data-table -->

<!-- Start values of the data-table -->

<rich:column>
    <h:outputText value="#reportingDoiPoolRow.doiPool.name"></h:outputText>
</rich:column>

<ui:repeat value="#reportingDoiPoolRow.amountOfDois" var="amount">
    <rich:column style="text-align:right;">
        <h:outputText value="#amount"/>
    </rich:column>
</ui:repeat>

<!-- Start values of the data-table -->

<f:facet name="footer">
    <rich:columnGroup>
        <rich:column style="text-align:left;">Totals</rich:column>

        <rich:column style="text-align:right;">
            <h:outputText value="12"></h:outputText>
        </rich:column>
        <rich:column style="text-align:right;">
            <h:outputText value="12"></h:outputText>
        </rich:column>

    </rich:columnGroup>
</f:facet>

问题出在以下块中:

<rich:column>
    <h:outputText value="#reportingDoiPoolRow.doiPool.name"></h:outputText>
</rich:column>

<ui:repeat value="#reportingDoiPoolRow.amountOfDois" var="amount">
    <rich:column style="text-align:right;">
        <h:outputText value="#amount"/>
    </rich:column>
</ui:repeat>

名称 (reportingDoiPoolRow.doiPool.name) 渲染良好,但 ui:repeat 内的每一列都未渲染。 似乎我不能将 reportingDoiPoolRow 变量用于另一次迭代。 我用于表格的集合都来自ArrayList(长)类型。 非常感谢您的帮助。

【问题讨论】:

您可能应该使用&lt;rich:columns&gt; 来呈现动态列数:livedemo.exadel.com/richfaces-demo/richfaces/… @MagnusTengdahl &lt;rich:columns&gt; 不幸地超出了最终范围。我在这里得到了:link 【参考方案1】:

我认为 &lt;ui:repeat&gt; 不起作用,因为 &lt;rich:column&gt; 不是 ui:repeat 旨在处理的(例如 &lt;li&gt; 或类似的东西),您应该使用 &lt;a4j:repeat&gt; 而不是'也不在那里工作(这与表格的构建方式有关)。

&lt;c:forEach&gt; 可以工作,但需要一点技巧:

<c:forEach var="index" begin="0" end="#reportingModel.columns - 1">
    <rich:column style="text-align:right;">
        <h:outputText value="#reportingDoiPoolRow.amountOfDois.get(index)" />
    </rich:column>
</c:forEach>

&lt;c:forEach&gt; 无法访问来自&lt;rich:dataTable&gt; 的属性(好吧,它可以访问rowKeyVar 但始终为1),因此您必须直接向bean 询问列大小,但是由&lt;c:forEach&gt; 渲染的作品将可以访问var

【讨论】:

嗨@Makhiel 感谢您的回答。你是对的,不可能从 c:forEach 中的 rich:dataTable 访问属性。您通过小技巧获得它的方法。对于我的示例,此 hack 之所以有效,是因为我访问了另一个与 reportingDoiPoolRow.amountOfDois 列表长度相同的属性 (reportingModel.headerList)。如果您真的需要在 c:forEach 中使用它,您还有其他选择吗?谢谢,非常感谢您的帮助。 它不总是有相同的长度吗?如果不只是将实际长度保存在 bean 中的某个位置,以便您可以访问它。 好的,这是个好主意。想象一下,我在标题中有几个月,每个月都有一个总值和一个新值。这意味着一个月有两列。我用该代码解决了它,因为我无法访问 reportingDoiPoolRow.amountOfDois 列表:&lt;c:forEach var="index" begin="0" end="#((reportingModel.headerList.size() *2)-1)"&gt; &lt;rich:column&gt; &lt;h:outputText value="#reportingDoiPoolRow.amountOfDois.get(index)" /&gt; &lt;/rich:column&gt; &lt;/c:forEach&gt; 非常感谢,伙计。我浪费了将近一周的时间来弄清楚这种荒谬的行为。太糟糕了,他们在 Richfaces 4.x 中删除了&lt;rich:columns&gt;,否则就不需要这个 hack..

以上是关于丰富的数据表不能将迭代变量用于嵌套循环的主要内容,如果未能解决你的问题,请参考以下文章

Python中的嵌套循环

变量可以传递给嵌套的for循环吗?

具有嵌套循环状态的填充变量

python中的if循环怎么样?

两层c:forEach循环嵌套

您如何将其转换为迭代函数而不是使用嵌套循环进行递归?