Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: stivloОтветов: 3

Я хотел бы чередовать цвет строки для каждой строки, я знаю, как чередовать цвет строки, используя 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 или есть лучшие способы?

javajspjstl

Ответы

Ответ 1 · рейтинг 5 · JB Nizet

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

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

Ответ 2 · рейтинг 2 · Bozho

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

Ответ 3 · рейтинг 1 · Igor Konoplyanko

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы