2015-02-17 11 views
13

Ho un frammento separato seguente in un modello di Thymeleaf.Visualizzazione della navigazione attiva in base ai dati contestuali

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

Voglio aggiungere una classe "attivo" per elemento di navigazione attiva - ma sembra compito difficile da realizzare in Thymyleaf, qualche suggerimento?

risposta

10

Si potrebbe aggiungere un ModelAttribute con il valore attiva nel vostro controller per ogni pagina, ad esempio, :

SettingsController.java

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

o in un SettingsControllerAdvice.java

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

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

} 

Poi, nel frammento di navigazione incluso nel vostro settings.html:

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

Infine, è possibile ripetere questo processo per ciascun controller e collegamenti nella barra di navigazione.

+0

Posso aggiungere questo in una sorta di contesto del processore, ecc? Quindi non ho bisogno di gestirlo esplicitamente? – thevangelist

+0

Non lo so, non ho mai provato. Ma puoi definirlo in un ControllerAdvice (metodo annotato con @ModelAttribute); potrebbe essere meno brutto e più facile da aggiornare.Modifico il mio post per darti questa alternativa. – lgd

33

È possibile farlo:

<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

Grazie a qualcosa che stavo cercando. – James

+3

Preferisco questo alla risposta accettata. Migliore separazione delle preoccupazioni. Non c'è bisogno di ingombrare il lato server con cose che sono solo legate alla vista. – bphilipnyc

15

Anche se penso che è brutto soluzione ed è peccato che thymeleaf non hai alcune macro per esso, è possibile utilizzare:

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

Sarà funziona anche per collegamenti "più profondi" come /hotels/new quindi è utilizzabile anche per i menu multilivello.

1

mentre questa è una vecchia domanda, voglio condividere questa soluzione in quanto potrebbe essere molto più elegante!

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

  • Aggiungere un parametro (ActiveTab) al frammento di navigazione.
<div th:fragment="common-navbar(activeTab)"></div> 
  • passare il valore di esso nelle pagine principali che utilizzano il frammento navbar
<div th:replace="common/navbar :: common-navbar(about)"></div> 
  • assegno in elemento 'li' per impostare la classe "attiva"
<li th:class="${activeTab == 'about'}? 'active' : null"><a href="">About</a></li> 
Problemi correlati