Spring + Thymeleaf を使用して簡単なアプリケーションを開発しています。ページの 1 つに、ページ分割する必要があるアイテムのリストがあります。
理想的には、currPageNo
(現在のページの数) とnumOfPages
(ページの総数) 変数のみをビューに送信し、残りの作業はそこで行われます (これはプレゼンテーションの問題であり、何もする必要はありません)。ビジネスロジックと一緒に)。ただし、最もクリーンなソリューションで最初にコントローラーで何らかの計算を行う必要がある場合、私はそれを小さな悪として受け入れます。
次の形式でページのリストを取得したいと思います。
<Prev | 1 | ... | 3 | 4 | 5 | 6 | 7 | ... | 15 | Next>
私は次の解決策しか思いつきませんでした。うまくいきますが、非常に面倒で読みにくいことに同意していただけると思います。
さらに、 と に加えて、さらにcurrPageNo
2numOfPages
つの変数をビューに送信する必要がありました。理想的な解決策は、私がそれを行う必要がないことです。
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 サイトの方が適していることは理解していますが、Thymeleaf はまだユーザー ベースが小さいテクノロジーのように思われるため、ユーザー数がはるかに多い Stack Overflow で合理的な回答が得られることを期待しています。ベース(私は信じています)。
ただし、そのような質問が本当に歓迎されない場合は、必要なアドバイスが得られるように、サイトを閉じるのではなく、適切なサイトに移動することを検討してください.