Jak najlepiej zrobić coś prostego if
- else
w Thymeleaf?
Chcę osiągnąć w Thymeleaf taki sam efekt jak
<c:choose>
<c:when test="${potentially_complex_expression}">
<h2>Hello!</h2>
</c:when>
<c:otherwise>
<span class="xxx">Something else</span>
</c:otherwise>
</c:choose>
w JSTL.
Co doszedłem do tej pory:
<div th:with="condition=${potentially_complex_expression}" th:remove="tag">
<h2 th:if="${condition}">Hello!</h2>
<span th:unless="${condition}" class="xxx">Something else</span>
</div>
Nie chcę oceniać potentially_complex_expression
dwa razy. Dlatego wprowadziłem zmienną lokalną condition
. Nadal nie lubię używać obu th:if="${condition}
i th:unless="${condition}"
.
Ważną rzeczą jest to, że używam dwóch różnych tagów HTML: powiedzmy h2
i span
.
Czy możesz zaproponować lepszy sposób, aby to osiągnąć?
Wypróbowałem ten kod, aby dowiedzieć się, czy klient jest zalogowany, czy anonimowy. Użyłem wyrażeń warunkowych
th:if
ith:unless
. Całkiem prosty sposób na zrobienie tego.<!-- IF CUSTOMER IS ANONYMOUS --> <div th:if="${customer.anonymous}"> <div>Welcome, Guest</div> </div> <!-- ELSE --> <div th:unless="${customer.anonymous}"> <div th:text=" 'Hi,' + ${customer.name}">Hi, User</div> </div>
źródło
Oprócz Daniela Fernándeza chciałbym podzielić się moim przykładem dotyczącym bezpieczeństwa.
<div th:switch="${#authentication}? ${#authorization.expression('isAuthenticated()')} : ${false}"> <span th:case="${false}">User is not logged in</span> <span th:case="${true}">Logged in user</span> <span th:case="*">Should never happen, but who knows...</span> </div>
Oto złożone wyrażenie z mieszanymi obiektami narzędziowymi „uwierzytelnianie” i „autoryzacja”, które dają wynik „prawda / fałsz” dla kodu szablonu tymeleaf.
Obiekty narzędziowe „uwierzytelnianie” i „autoryzacja” pochodzą z biblioteki thymeleaf extras springsecurity3 . Gdy obiekt „authentication” nie jest dostępny LUB authorisation.expression („isAuthenticated ()”) przyjmuje wartość „false”, wyrażenie zwraca $ {false}, w przeciwnym razie $ {true}.
źródło
true
ifalse
literałów - nie musisz używać do nich wyrażeń podstawiania zmiennych. Zobacz także odpowiedź Yatendry .Możesz użyć
If-then-else: (if) ? (then) : (else)
Przykład:
'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown'))
Może to być przydatne dla nowych osób zadających to samo pytanie.
źródło
Inne rozwiązanie - możesz użyć zmiennej lokalnej:
<div th:with="expr_result = ${potentially_complex_expression}"> <div th:if="${expr_result}"> <h2>Hello!</h2> </div> <div th:unless="${expr_result}"> <span class="xxx">Something else</span> </div> </div>
Więcej o zmiennych lokalnych:
http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#local-variables
źródło
th:each
gdzie wyrażenie ma:
zamiast=
W prostszym przypadku (gdy tagi html są takie same):
<h2 th:text="${potentially_complex_expression} ? 'Hello' : 'Something else'">/h2>
źródło
Innym rozwiązaniem jest użycie po prostu
not
odwrotnej negacji:<h2 th:if="${potentially_complex_expression}">Hello!</h2> <span class="xxx" th:if="${not potentially_complex_expression}">Something else</span>
Jak wyjaśniono w dokumentacji , jest to to samo, co używanie
th:unless
. Jak wyjaśniły inne odpowiedzi:Używanie
not
również działa, ale IMHO jest bardziej czytelne w użyciuth:unless
zamiast negowania warunku za pomocąnot
.źródło
<div th:switch="${user.role}"> <p th:case="'admin'">User is an administrator</p> <p th:case="#{roles.manager}">User is a manager</p> <p th:case="*">User is some other thing</p> </div> <div th:with="condition=${potentially_complex_expression}" th:remove="tag"> <h2 th:if="${condition}">Hello!</h2> <span th:unless="${condition}" class="xxx">Something else</span> </div>
źródło
<div style="width:100%"> <span th:each="i : ${#numbers.sequence(1, 3)}"> <span th:if="${i == curpage}"> <a href="/listEmployee/${i}" class="btn btn-success custom-width" th:text="${i}"></a </span> <span th:unless="${i == curpage}"> <a href="/listEmployee/${i}" class="btn btn-danger custom-width" th:text="${i}"></a> </span> </span> </div>
wprowadź opis obrazu tutaj
źródło
Użyj
th:switch
jakoif-else
<span th:switch="${isThisTrue}"> <i th:case="true" class="fas fa-check green-text"></i> <i th:case="false" class="fas fa-times red-text"></i> </span>
Użyj
th:switch
jakoswitch
<span th:switch="${fruit}"> <i th:case="Apple" class="fas fa-check red-text"></i> <i th:case="Orange" class="fas fa-times orange-text"></i> <i th:case="*" class="fas fa-times yellow-text"></i> </span>
źródło