Thymeleafテンプレートに次の分離されたフラグメントがあります。
<ul class="nav nav-tabs">
<li role="presentation"><a href="/">Freight Invoices</a></li>
<li role="presentation"><a href="/processed">Processed Invoices</a></li>
<li role="presentation"><a href="/postingrules">Posting Rules</a></li>
<li role="presentation" class="active"><a href="/settings">Settings</a></li>
</ul>
「アクティブな」クラスをアクティブなナビゲーション要素に追加したいのですが、Thymyleafでは実現が難しいようです。助言がありますか?
ModelAttributeを値activeとともに各ページのコントローラに追加できます。 :
SettingsController.Java
@RequestMapping("/settings")
public String viewSettings(Model model) {
// do stuff
model.addAttribute("classActiveSettings","active");
return "settings";
}
またはSettingsControllerAdvice.Java
@ControllerAdvice(assignableTypes = SettingsController.class)
public class SettingsControllerAdvice {
@ModelAttribute("classActiveSettings")
public String cssActivePage() {
return "active";
}
}
次に、settings.htmlに含まれるナビゲーションフラグメントで:
<ul class="nav nav-tabs">
<!-- Other links -->
<li role="presentation" th:class="${classActiveSettings}">
<a th:href="@{/settings}">Settings</a>
</li>
</ul>
最後に、コントローラごとにこのプロセスを繰り返し、ナビゲーションバーにリンクを設定できます。
あなたはこれを行うことができます:
<ul class="nav navbar-nav">
<li th:classappend="${#httpServletRequest.getRequestURI() == '/dashboard' ? 'active':''}"><a th:href="@{/dashboard}"><span>Dashboard</span></a></li>
<li th:classappend="${#httpServletRequest.getRequestURI() == '/orders' ? 'active':''}"><a th:href="@{/orders}"><span>Orders</span></a></li>
<li th:classappend="${#httpServletRequest.getRequestURI() == '/income' ? 'active':''}"><a th:href="@{/income}"><span>Income</span></a></li>
<li role="separator" ></li>
</ul>
私はそれが醜い解決策であり、thymeleafがそれにいくつかのマクロを持っていないのは残念ですが、あなたは使うことができます:
<li th:classappend="${#httpServletRequest.getRequestURI().startsWith('/hotels') ? 'active':''}">
Hotel
</li>
/ hotels/newのような「より深い」リンクにも機能するので、マルチレベルのメニューにも使用できます。
これは古い質問ですが、このソリューションはよりエレガントになる可能性があるため、共有したいと思います。
http://nixmash.com/post/bootstrap-navbar-highlighting-in-thymeleaf
<div th:fragment="common-navbar(activeTab)"></div>
<div th:replace="common/navbar :: common-navbar(about)"></div>
<li th:class="${activeTab == 'about'}? 'active' : null"><a href="">About</a></li>
Thymeleaf 3を使用している場合:
_<a th:href="@{/home}" th:classappend="${#request.getRequestURI() == '/home' ? 'active' : ''}">Home</a>
_
アプリケーションにコンテキストパスがある場合:
_<a th:href="@{/home}" th:classappend="${#request.getRequestURI() == '/context-path/home' ? 'active' : ''}">Home</a>
_
編集:
簡潔にするために:
_<a th:href="@{/home}" th:classappend="${#request.getServletPath() == '/home' ? 'active' : ''}">Home</a>
_
request.getServletPath()
を使用する利点は、コンテキストパスがあっても、それを無視することです。
このコードは誰かに役立つかもしれません。注意!これはThymeleafソリューションではなく、ページに追加できるjsコードだけです。
var currentPage = location.href.match(/(.*?)([^\/]+)$/).pop();
$(Array.prototype.filter.call($('.menu-head li a:nth-child(1)'), function(item)
{
return item.href.endsWith(currentPage)
})).parents('li').addClass('active');