2015-02-17 9 views
13

Ich habe ein folgendes getrenntes Fragment in einer Thymeleaf-Vorlage.Aktive Navigation basierend auf kontextabhängigen Daten anzeigen

<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> 

Ich will eine „aktive“ Klasse aktiven Navigationselement hinzufügen - aber es scheint harte Aufgabe in Thymyleaf, irgendwelche Vorschläge zu erreichen?

Antwort

10

könnten Sie fügen einen ModelAttribute mit dem Wert aktiv in Ihrem Controller für jede Seite, zum Beispiel :

SettingsController.java

@RequestMapping("/settings") 
public String viewSettings(Model model) { 
    // do stuff 
    model.addAttribute("classActiveSettings","active"); 
    return "settings"; 
} 

OR in einem SettingsControllerAdvice.java

@ControllerAdvice(assignableTypes = SettingsController.class) 
public class SettingsControllerAdvice { 

    @ModelAttribute("classActiveSettings") 
    public String cssActivePage() { 
     return "active"; 
    } 

} 

im Navigations Fragment in Ihrem settings.html enthalten Dann:

<ul class="nav nav-tabs"> 
    <!-- Other links --> 
    <li role="presentation" th:class="${classActiveSettings}"> 
     <a th:href="@{/settings}">Settings</a> 
    </li> 
</ul> 

Schließlich können Sie diesen Vorgang für jeden Controller und Links in Ihrer Navbar wiederholen.

+0

Kann ich das in einer Art Kontextprozessor usw. hinzufügen? Also muss ich nicht explizit damit umgehen? – thevangelist

+0

Ich weiß es nicht, ich habe es nie versucht. Aber Sie können dies in einem ControllerAdvice definieren (Methode mit @ModelAttribute annotiert); Es könnte weniger hässlich und einfacher zu aktualisieren sein.Ich bearbeite meinen Beitrag, um Ihnen diese Alternative zu geben. – lgd

33

Sie können dies tun:

<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> 
+0

Danke, was ich gesucht habe. – James

+3

Ich ziehe das der angenommenen Antwort vor. Bessere Trennung von Bedenken. Es ist nicht nötig, die Server-Seite mit Dingen zu überladen, die nur mit der Ansicht zusammenhängen. – bphilipnyc

15

Obwohl ich denke, dass es hässlich Lösung ist, und es ist schade, dass thymeleaf nicht einige Makros für sie nicht haben, können Sie verwenden:

<li th:classappend="${#httpServletRequest.getRequestURI().startsWith('/hotels') ? 'active':''}"> 
    Hotel 
</li> 

Es wird Arbeiten Sie auch für "tiefere" Links wie /Hotels/neue so ist es auch für Multilevel-Menüs verwendbar.

1

Während dies eine alte Frage ist, möchte ich diese Lösung teilen, da es viel eleganter sein könnte!

http://nixmash.com/post/bootstrap-navbar-highlighting-in-thymeleaf

  • einen Parameter hinzufügen (ACTIVETAB) an das Navigations Fragment.
<div th:fragment="common-navbar(activeTab)"></div> 
  • passieren den Wert davon in den Hauptseiten, die die navbar Fragment
<div th:replace="common/navbar :: common-navbar(about)"></div> 
  • Prüfung für sie in 'li' -Element verwenden einzustellen die 'aktive' Klasse
Verwandte Themen