Я разрабатываю простое приложение с помощью Spring + Thymeleaf. На одной из страниц у меня есть список элементов, которые должны быть разбиты на страницы.
В идеале я хотел бы только отправить переменные currPageNo
(номер текущей страницы) и numOfPages
(общее количество страниц) в представление, а остальная часть работы будет выполнена там (это является проблемой презентации и не имеет ничего общего с бизнес-логикой). Если, однако, самое чистое решение потребует от меня сначала выполнить некоторые вычисления в контроллере, я бы принял это как небольшое зло.
Я хотел бы получить список страниц в следующей форме.
<Prev | 1 | ... | 3 | 4 | 5 | 6 | 7 | ... | 15 | Next>
Я мог только прийти к следующему решению. Это работает, но я считаю, что вы согласитесь, что это очень грязно и очень трудно читать.
Кроме того, помимо currPageNo
и numOfPages
мне пришлось отправить еще две переменные в представление. Идеальное решение не потребует от меня этого.
firstPageNo = Math.max(2, currPageNo - 2)
lastPageNo = Math.min(numOfPages - 1, currPageNo + 2)
Ниже приведена текущая версия моего кода.
<ul>
<li th:if="${currPageNo > 1}">
<a th:href="@{/items.html(pageNo = ${currPageNo - 1})}" href="">< Prev</a>
</li>
<li th:class="${currPageNo == 1} ? 'selected'">
<a th:href="@{/items.html(pageNo = 1)}" th:if="${currPageNo > 1}" href="">1</a>
<span th:if="${currPageNo == 1}">1</span>
</li>
<li th:if="${currPageNo >= 5}">
...
</li>
<li th:each="pageNo : ${#numbers.sequence(firstPageNo, lastPageNo)}" th:class="${currPageNo == pageNo} ? 'selected'">
<a th:href="@{/items.html(pageNo = ${pageNo})}" th:if="${pageNo != currPageNo}" th:text="${pageNo}" href="">2</a>
<span th:if="${pageNo == currPageNo}" th:text="${pageNo}">2</span>
</li>
<li th:if="${currPageNo <= (numOfPages - 4)}">
...
</li>
<li th:class="${currPageNo == numOfPages} ? 'selected'">
<a th:href="@{/items.html(pageNo = ${numOfPages})}" th:if="${currPageNo < numOfPages}" th:text="${numOfPages}" href="">10</a>
<span th:if="${currPageNo == numOfPages}" th:text="${numOfPages}">1</span>
</li>
<li th:if="${currPageNo < numOfPages}">
<a th:href="@{/items.html(pageNo = ${currPageNo + 1})}" href=""> Next ></a>
</li>
</ul>
В следующем списке суммируются вопросы, которые я хотел бы избавиться от большинства. Я понимаю, что некоторые из них присущи платформе, но, тем не менее, список, похоже, уходит долго, а код беспорядочен.
- Необходимо отправить предварительно сконфигурированные значения
firstPageNo
иlastPageNo
в представление из контроллера. - При использовании
<
вместо<
в выражениях. - Необходимо использовать как привязку, так и диапазон с взаимоисключающими условиями, чтобы браузер не использовал ссылку для текущей страницы.
Я также приветствую любые другие предложения о том, как улучшить качество кода.
Я понимаю, что, возможно, этот вопрос лучше подходит для сайта Code Review, но, поскольку Тимелеаф, похоже, является технологией с крошечной базой пользователей, я ожидаю разумного ответа, скорее, на Stack Overflow, который имеет гораздо больше пользовательской базы (я считаю).
Если, однако, такой вопрос действительно не приветствуется здесь, подумайте о том, чтобы переместить его на нужный сайт, а не закрывать его, чтобы я получил совет, который мне нужен.