丰富的数据表不能将迭代变量用于嵌套循环
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
(长)类型。
非常感谢您的帮助。
【问题讨论】:
您可能应该使用<rich:columns>
来呈现动态列数:livedemo.exadel.com/richfaces-demo/richfaces/…
@MagnusTengdahl <rich:columns>
不幸地超出了最终范围。我在这里得到了:link
【参考方案1】:
我认为 <ui:repeat>
不起作用,因为 <rich:column>
不是 ui:repeat 旨在处理的(例如 <li>
或类似的东西),您应该使用 <a4j:repeat>
而不是'也不在那里工作(这与表格的构建方式有关)。
<c:forEach>
可以工作,但需要一点技巧:
<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>
<c:forEach>
无法访问来自<rich:dataTable>
的属性(好吧,它可以访问rowKeyVar
但始终为1),因此您必须直接向bean 询问列大小,但是由<c:forEach>
渲染的作品将可以访问var
。
【讨论】:
嗨@Makhiel 感谢您的回答。你是对的,不可能从 c:forEach 中的 rich:dataTable 访问属性。您通过小技巧获得它的方法。对于我的示例,此 hack 之所以有效,是因为我访问了另一个与 reportingDoiPoolRow.amountOfDois 列表长度相同的属性 (reportingModel.headerList)。如果您真的需要在 c:forEach 中使用它,您还有其他选择吗?谢谢,非常感谢您的帮助。 它不总是有相同的长度吗?如果不只是将实际长度保存在 bean 中的某个位置,以便您可以访问它。 好的,这是个好主意。想象一下,我在标题中有几个月,每个月都有一个总值和一个新值。这意味着一个月有两列。我用该代码解决了它,因为我无法访问 reportingDoiPoolRow.amountOfDois 列表:<c:forEach var="index" begin="0" end="#((reportingModel.headerList.size() *2)-1)"> <rich:column> <h:outputText value="#reportingDoiPoolRow.amountOfDois.get(index)" /> </rich:column> </c:forEach>
非常感谢,伙计。我浪费了将近一周的时间来弄清楚这种荒谬的行为。太糟糕了,他们在 Richfaces 4.x 中删除了<rich:columns>
,否则就不需要这个 hack..以上是关于丰富的数据表不能将迭代变量用于嵌套循环的主要内容,如果未能解决你的问题,请参考以下文章