Operador ternario múltiple Thymeleaf con condición OR

Aug 20 2020

Con Thymeleaf estoy usando esto (funciona bien):

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

Ahora quiero establecer la clase activa en el menú principal si se hace clic en cualquiera de las URL 1/2/3/4. Así que probé esto (y NO funcionó):

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

También probé muchas otras combinaciones con "o" y "||", nada funcionó. Todas estas URL (rutas de contexto) son totalmente diferentes y NO PUEDO usar like - contains. Estoy seguro de que me estoy perdiendo la idea, pero necesito ayuda aquí. Amablemente sugiera.

Respuestas

1 JakubCh. Aug 20 2020 at 18:33

Parece que desea agregar la activeclase cuando el URI de solicitud coincide con cualquiera de un conjunto de valores fijos. Entonces puedes escribir tu <li>elemento así:

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

...dónde:

  • th:withdeclara una matriz nombrada urlsque contiene direcciones URL que desencadena la adición de una clase.
  • th:classappendcomprueba si la urlsmatriz contiene un valor devuelto por #httpServletRequest.getRequestURI()y agrega condicionalmente una clase.