Чередующийся цвет строки в JSTL с вложенным циклом

Я хотел бы чередовать цвет строки для каждой строки, я знаю, как чередовать цвет строки, используя varStatus в цикле forEach. Однако теперь у меня есть вложенный цикл.

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

Приведенный выше код использует только varStatus 'loop2' и является лишь приблизительным. Как решить проблему? Я должен ввести свою переменную count или есть лучшие способы?


person stivlo    schedule 28.05.2011    source источник


Ответы (3)


Просто используйте специальный счетчик:

<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>
person JB Nizet    schedule 28.05.2011
comment
Я попробовал, и это работает, спасибо. Мне было интересно, действительно ли необходимо говорить value=${0} вместо просто value=0. Это о типе данных, число против строки? Потому что я пробовал также со значением = 0 и все еще работает. - person stivlo; 28.05.2011
comment
Это работает, но мне кажется более логичным использовать ${0}, потому что я считаю, что тип выражения более очевиден. - person JB Nizet; 28.05.2011

  • сохранить сумму всех итерированных элементов (используя <c:set>). Вы можете сделать это во внешнем цикле, вычислив currentSum = currentSum + fn:length(aPermission.ipRanges). Сделайте это после внутреннего цикла
  • используйте currentSum + loop2.index, чтобы проверить цвет для каждой строки.
person Bozho    schedule 28.05.2011
comment
Это сработает, но кажется более сложным, чем использование специального счетчика. - person stivlo; 28.05.2011

Есть 1-строчный способ.

UPD. Я ошибся первый раз. есть правильное решение без лишних переменных.

<tr class="${(loop2.index*fn:length(aPermission.ipRanges) + loop1.index) % 2 == 0 ? 'row0' : 'row1'}">
person Igor Konoplyanko    schedule 28.05.2011
comment
Я думал об этом, но этот способ не работает, потому что, например: петля1 начинается с 0, а петля2 начинается с 0, 0+0=0, вторая строка петля1 равна 0, петля2 равна 1, 1+0=1, третья строка loop1 равна 1, loop2 равна 0, 0+1=1. два последовательных ряда одного цвета. - person stivlo; 28.05.2011
comment
Извините, это тоже не сработает, потому что вы предполагаете, что каждое разрешение имеет одинаковое количество ipRanges, что неверно. У него может быть любое число от 1 и выше, и каждое Разрешение может иметь разное их количество. Спасибо за попытку помочь в любом случае! - person stivlo; 28.05.2011
comment
Ах. Тогда счетчик действительно необходим :) - person Igor Konoplyanko; 31.05.2011