Thymeleaf multipler ternärer Operator mit ODER-Bedingung

Aug 20 2020

Mit Thymeleaf verwende ich das (es funktioniert gut):

<li class="drop-down" th:classappend="${#httpServletRequest.getRequestURI() == '/url1' ? 'active':''}"><a href="#">MainMenu</a>
<ul>
<li><a href="/url1" th:href="@{/url1}"><i
class="fas fa-users"></i> url1</a></li>
<li><a href="/url2" th:href="@{/url2}"><i
class="fas fa-users"></i> url2</a></li>
<li><a href="/url3" th:href="@{/url3}"><i
class="far fa-file-alt mr-1"></i> url3</a></li>
<li><a href="/url4" th:href="@{/url4}"><i
class="fas fa-sign-out-alt mr-1"></i>url4</a></li>
</ul></li>

Jetzt möchte ich die aktive Klasse auf das Hauptmenü setzen, wenn auf eine der URLs 1/2/3/4 geklickt wird. Also habe ich das versucht (und es hat NICHT funktioniert):

<li class="drop-down" th:classappend="${#httpServletRequest.getRequestURI() == '/url1' ? 'active':'' :: '/url2' ? 'active':'' :: '/url3' ? 'active':'' :: '/url4' ? 'active':'' }"

Ich habe auch viele andere Kombinationen mit "or" und "||" ausprobiert, nichts hat funktioniert. Alle diese URLs (Kontextpfade) sind völlig unterschiedlich und ich KANN NICHT verwenden wie - enthält. Ich bin mir sicher, dass ich die Idee vermisse, aber ich brauche hier etwas Hilfe. Bitte vorschlagen.

Antworten

1 JakubCh. Aug 20 2020 at 18:33

Es scheint, dass Sie die Klasse anhängen möchten, activewenn der Anforderungs-URI mit einem aus einer Reihe von festen Werten übereinstimmt. Sie können Ihr <li>Element also folgendermaßen schreiben:

<li
   class="drop-down"
   th:with="urls=${new String[]{'/url1','/url2','/url3','/url4'}}" th:classappend="${#arrays.contains(urls, #httpServletRequest.getRequestURI()) ? 'active' : ''}">

...wo:

  • th:withdeklariert ein Array namens urlsmit URLs, das das Anhängen einer Klasse auslöst.
  • th:classappendprüft, ob das urlsArray einen von zurückgegebenen Wert enthält, #httpServletRequest.getRequestURI()und hängt bedingt eine Klasse an.