2011-05-28 49 views
2

我想为每一行交替行颜色,我知道如何在forEach循环中使用varStatus来交替行颜色。但是现在,我有一个嵌套循环。使用嵌套循环的JSTL中的交替行颜色

<c:forEach var="aPermission" items="${Permissions}" varStatus="loop1"> 
    <c:forEach var="anIpRange" items="${aPermission.ipRanges}" varStatus="loop2"> 
    <tr class="${loop2.index % 2 == 0 ? 'row0' : 'row1'}"> [...] 
    </c:forEach> 
</c:forEach> 

上面的代码仅使用'loop2'varStatus,它只是一个近似值。如何解决问题?我必须介绍我的count变量还是有更好的方法?

回答

5

只需使用专用柜台:

<c:set var="counter" value="${0}"/> 
<c:forEach var="aPermission" items="${Permissions}" varStatus="loop1"> 
    <c:forEach var="anIpRange" items="${aPermission.ipRanges}" varStatus="loop2"> 
     <tr class="${counter % 2 == 0 ? 'row0' : 'row1'}"> [...] </tr> 
     <c:set var="counter" value="${counter + 1}"/> 
    </c:forEach> 
</c:forEach> 
+0

我试过了,它的工作原理,谢谢。我想知道是否真的有必要说value =“$ {0}”,而不是value =“0”。那是关于数据类型,数字还是字符串?因为我也尝试了值=“0”,仍然有效。 – stivlo 2011-05-28 09:47:25

+0

它有效,但使用$ {0}对我来说似乎更符合逻辑,因为我发现表达式的类型更加明显。 – 2011-05-28 09:58:03

2
  • 存储所有迭代项目的总和(使用<c:set>)。您可以通过计算currentSum = currentSum + fn:length(aPermission.ipRanges)在外部循环中执行此操作。在内部循环后执行此操作
  • 使用currentSum + loop2.index检查每行的颜色。
+0

这工作,但似乎比使用专用柜台更复杂。 – stivlo 2011-05-28 09:42:31

1

有一条线路。

UPD。我第一次误会了。有没有冗余变量的正确解决方案。

<tr class="${(loop2.index*fn:length(aPermission.ipRanges) + loop1.index) % 2 == 0 ? 'row0' : 'row1'}"> 
+0

我想过了,但这种方式不起作用,因为例如:loop1从0开始,loop2从0开始,0 + 0 = 0,第二行loop1为0,loop2为1,1 + 0 = 1,第三行loop1为1,loop2为0,0 + 1 = 1。 arghh两个连续的行具有相同的颜色。 – stivlo 2011-05-28 09:39:09

+0

对不起,这也不起作用,因为你认为每个权限都有相同数量的ipRanges,这是不正确的。它可以从1开始有任何数字,每个权限可以有不同数量的数字。无论如何谢谢您试图帮助! – stivlo 2011-05-28 14:30:32

+0

啊。然后计数器是真的需要:) – 2011-05-31 13:49:48