基于上下文数据显示活动导航
Displaying active navigation based on contextual data
我在 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>
我想向活动导航元素添加 "active" class — 但似乎很难在 Thymyleaf 中完成。有什么建议吗?
您可以在每个页面的控制器中添加值为 active 的 ModelAttribute,例如:
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>
它也适用于 "deeper" 链接,例如 /hotels/new,因此它也可用于多级菜单。
虽然这是一个老问题,但我想分享这个解决方案,因为它可以更优雅!
http://nixmash.com/post/bootstrap-navbar-highlighting-in-thymeleaf
- 向导航片段添加一个参数 (activeTab)。
<div th:fragment="common-navbar(activeTab='activeTab')"></div>
- 在使用导航栏片段的主要页面中传递它的值
<div th:replace="common/navbar :: common-navbar(about)"></div>
- 在 'li' 元素中检查它以设置 'active' class
<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');
我在 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>
我想向活动导航元素添加 "active" class — 但似乎很难在 Thymyleaf 中完成。有什么建议吗?
您可以在每个页面的控制器中添加值为 active 的 ModelAttribute,例如:
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>
它也适用于 "deeper" 链接,例如 /hotels/new,因此它也可用于多级菜单。
虽然这是一个老问题,但我想分享这个解决方案,因为它可以更优雅!
http://nixmash.com/post/bootstrap-navbar-highlighting-in-thymeleaf
- 向导航片段添加一个参数 (activeTab)。
<div th:fragment="common-navbar(activeTab='activeTab')"></div>
- 在使用导航栏片段的主要页面中传递它的值
<div th:replace="common/navbar :: common-navbar(about)"></div>
- 在 'li' 元素中检查它以设置 'active' class
<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');