Thymeleaf'te if-else nasıl yapılır?


132

Basit yapmanın en iyi yolu nedir if- elseThymeleaf'te?

Thymeleaf'te de aynı etkiyi elde etmek istiyorum

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

JSTL'de.

Şimdiye kadar ne düşündüm:

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

potentially_complex_expressionİki kez değerlendirmek istemiyorum . Bu yüzden yerel değişkeni tanıttım condition. Yine de th:if="${condition}ve ikisini birden kullanmayı sevmiyorum th:unless="${condition}".

Önemli bir şey, iki farklı HTML etiketi kullanmam: diyelim h2ve diyelim span.

Bunu başarmanın daha iyi bir yolunu önerebilir misiniz?

Yanıtlar:


208

Thymeleaf'ın bir eşdeğeri vardır <c:choose>ve <c:when>: Thymeleaf 2.0'da tanıtılan th:switchve th:caseöznitelikleri.

*Varsayılan durum için kullanarak beklediğiniz gibi çalışırlar :

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

Bkz bu sözdizimi hızlı bir açıklama (veya Thymeleaf öğreticiler) için.

Sorumluluk Reddi : StackOverflow kurallarının gerektirdiği gibi, Thymeleaf'in yazarıyım.


tamam ama .. müşteri türüne göre (yani anonim veya oturum açmış) bir javascript'i nasıl çalıştırırım ...
Lucky

1
Özellikle "Kullanarak Thymeleaf" nde bölümünde "JavaScript inlining", "Metin inlining" bölümüne bakınız öğretici içinde thymeleaf.org/documentation.html
Daniel Fernández

Ve bunu nasıl yapabilirim: iterator.index değerini etkinleştirebilirim? Değer <5 olduğunda bir dizi durum yapmak ve değer> 5 ise varsayılan duruma geçmek istiyorum
Kaybeden Coder

@ DanielFerninski: Lütfen bana stackoverflow.com/questions/48499723/… konusunda yardım eder misin ? Sizi doğrudan soruda etiketleyemedim. Gerçekten sıkışmış.
iskele

98

Bir müşterinin oturum açmış veya anonim olup olmadığını öğrenmek için bu kodu denedim. th:ifVe th:unlesskoşullu ifadeleri kullanarak yaptım . Bunu yapmanın oldukça basit yolu.

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

5
Bu, OP'nin sorusuna cevap vermiyor çünkü karmaşık ifadeleri tekrarlamaktan kaçınmakla ilgiliydi. Ve diğer çözümler gibi, bu da Thymeleaf'in önemli bir satış noktası olan "doğal şablonlar" fikrini kırıyor. Bu konuda kendim ne yapacağımı bilmiyordum, ancak birinin bir cevabı olması durumunda bunu belirtmek istedim.
Stephen Harrison

@Lucky bu bana bir hata veriyor EL1007E: (konum 0): Mülk veya 'Durum' alanı bulunamıyor
Jesse

@Jackie Yukarıdaki örnekte, müşteri bir nesnedir ve anonim, Customer sınıfındaki bir boole alanıdır. Nesnenizin boş olmadığından ve alan adının doğru olduğundan emin olun.
Şanslı

25

Daniel Fernández'e ek olarak güvenlikle ilgili örneğimi paylaşmak istiyorum.

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

Burada, üçlü şablon kodu için 'doğru / yanlış' sonucu üreten karışık 'kimlik doğrulama' ve 'yetkilendirme' yardımcı program nesneleri içeren karmaşık ifade verilmiştir.

'Kimlik doğrulama' ve 'yetkilendirme' yardımcı programı nesneleri thymeleaf extras springsecurity3 kitaplığından geldi . 'Kimlik doğrulama' nesnesi mevcut olmadığında VEYA authorization.expression ('isAuthenticated ()') 'false' olarak değerlendirilir, ifade $ {false}, aksi takdirde $ {true} döndürür.


19

Kullanabilirsiniz

If-then-else:  (if) ? (then) : (else)

Misal:

'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown'))

Aynı soruyu soran yeni insanlar için faydalı olabilir.


12

Başka bir çözüm - yerel değişkeni kullanabilirsiniz:

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

Yerel değişkenler hakkında daha fazla bilgi:
http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#local-variables


Kodunuza fazladan bir "=" işareti eklediğinizi düşünüyorum. Lütfen tekrar doğrulayın ve haklıysam düzeltin.
Lucky

Benim görüşüme göre kod tamam. Hangi ekstra '=' işaretini kastettiğinizi bilmiyorum.
jareks

Evet, kod tamam. Üzgünüm, th:eachifadenin :yerine geçtiği yerle karıştırdım=
Lucky

Ancak bu cevap benim çözümüme çok yakın. Th yaparken: ifade ile bana gereksiz geliyor. Temel olarak bu çözüm, koşullu ifadeler olmadığı sürece th: if ve th: kullanır.
Lucky

Gereksiz olmadığını düşünüyorum. Yalnızca th: if ve th: kullanırsanız karmaşık ifade iki kez çalıştırılmazsa ...
jareks


7

Diğer bir çözüm ise tam nottersi olumsuzluğu elde etmek için kullanmaktır :

<h2 th:if="${potentially_complex_expression}">Hello!</h2>
<span class="xxx" th:if="${not potentially_complex_expression}">Something else</span>

Belgelerde açıklandığı gibi, kullanmakla aynı şeydirth:unless . Diğer cevapların da açıkladığı gibi:

Ayrıca, OGNL ifadesi içinde not kullanmak yerine önceki örnekte kullanabileceğimiz th:ifbir ters özniteliğe sahiptir.th:unless

Kullanmak notda işe yarar, ancak IMHO th:unlessile koşulu olumsuzlamak yerine kullanılması daha okunabilir not.


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

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

görüntü açıklamasını buraya girin


1

Kullan th:switchbir şekildeif-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>

Kullanım th:switcha kadarswitch

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.