Pracuję nad prostą aplikacją przy użyciu Spring + Thymeleaf. Na jednej ze stron mam listę przedmiotów, które muszą być pogrupowane.Spring + Thymeleaf - jak zaimplementować paginację dla listy
Idealnie chciałbym przesłać tylko currPageNo
(numer bieżącej strony) i numOfPages
(całkowita liczba stron) zmiennych do widoku, a reszta pracy zostanie wykonana tam (jest to prezentacja problem i nie ma nic wspólnego z logiką biznesową). Gdyby jednak najczystsze rozwiązanie wymagało ode mnie najpierw dokonania obliczeń w sterowniku, uznałbym to za małe zło.
Chciałbym uzyskać listę stron w poniższym formularzu.
<Prev | 1 | ... | 3 | 4 | 5 | 6 | 7 | ... | 15 | Next>
Mogłem przyjść tylko z następującym rozwiązaniem. Działa, ale wierzę, że zgodzisz się, że jest bardzo brudny i naprawdę trudny do odczytania.
Ponadto, oprócz currPageNo
i numOfPages
musiałem wysłać dwie dodatkowe zmienne do widoku. Idealne rozwiązanie nie wymagałoby tego.
firstPageNo = Math.max(2, currPageNo - 2)
lastPageNo = Math.min(numOfPages - 1, currPageNo + 2)
Obecna wersja mojego kodu następuje.
<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>
Poniższa lista podsumowuje problemy, które chciałbym pozbyć się najbardziej. Rozumiem, że niektóre z nich są nieodłącznie związane z platformą, ale mimo to lista wydaje się być zamknięta, a kod jest niechlujny.
- uwzględniając wysłać precomputed wartości
firstPageNo
ilastPageNo
do widoku z kontrolera. - Konieczność użycia
<
zamiast<
w wyrażeniach. - Posiadanie zarówno kotwicy, jak i przęsła z wzajemnie wykluczającymi się warunkami, aby przeglądarka nie korzystała z linku do bieżącej strony.
Z zadowoleniem przyjmuję również wszelkie inne sugestie dotyczące poprawy jakości kodu.
Rozumiem, że może to pytanie byłoby lepsze dopasowanie do serwisu Code Review, ale, jak Thymeleaf wydaje się technologię z małym bazy użytkowników jeszcze, spodziewam rozsądną odpowiedź raczej tutaj na przepełnienie stosu , który ma znacznie większą bazę użytkowników (jak sądzę).
Jeśli jednak takie pytanie nie jest tutaj mile widziane, należy rozważyć przeniesienie go na właściwą stronę zamiast jej zamknięcia, aby uzyskać potrzebne porady.
Proszę podać tekst, na przykład wyjaśnienie z kodem. –
Nie po prostu zrzuć kod ... dodaj trochę mięsa do niego. – Werner
Uwaga: od tej pory musisz zastąpić 'firstPage' i' lastPage' opcjami 'first' i' last'. – membersound