Operatore ternario multiplo Thymeleaf con condizione OR

Aug 20 2020

Con Thymeleaf sto usando questo (funziona bene):

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

Ora voglio impostare la classe attiva nel menu principale se si fa clic su uno qualsiasi degli URL 1/2/3/4. Quindi ho provato questo (e NON ha funzionato):

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

Inoltre ho provato molte altre combinazioni con "o" e "||", niente ha funzionato. Tutti questi URL (percorsi di contesto) sono totalmente diversi e NON POSSO usare like - contains. Sono sicuro che mi manca l'idea, ma ho bisogno di aiuto qui. Si prega di suggerire.

Risposte

1 JakubCh. Aug 20 2020 at 18:33

Sembra che tu voglia aggiungere la activeclasse quando l'URI della richiesta corrisponde a qualsiasi da un insieme di valori fissi. Quindi puoi scrivere il tuo <li>elemento in questo modo:

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

...dove:

  • th:withdichiara un array denominato urlscontenente URL che attiva l'aggiunta di una classe.
  • th:classappendcontrolla se l' urlsarray contiene un valore restituito da #httpServletRequest.getRequestURI()e accoda in modo condizionale una classe.