कैसे करें-अगर थाइमेलफ में क्या करें?


132

एक सरल करने के लिए सबसे अच्छा तरीका क्या है if- elseथाइमेल्फ में?

मैं Thymeleaf में एक ही प्रभाव के रूप में प्राप्त करना चाहते हैं

<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 में।

मैंने अब तक क्या सोचा है:

<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दो बार मूल्यांकन नहीं करना चाहता । इसलिए मैंने स्थानीय चर पेश किया condition। फिर भी मुझे th:if="${condition}और दोनों का उपयोग करना पसंद नहीं है th:unless="${condition}"

एक महत्वपूर्ण बात यह है कि मैं दो अलग-अलग एचटीएमएल टैग का उपयोग करता हूं: चलो कहते हैं h2और span

क्या आप इसे प्राप्त करने का बेहतर तरीका सुझा सकते हैं?

जवाबों:


208

Thymeleaf के पास एक समान है <c:choose>और <c:when>: The th:switchऔर th:caseविशेषताएँ Thymeleaf 2.0 में प्रस्तुत की गई हैं।

वे *डिफ़ॉल्ट स्थिति के लिए उपयोग करते हुए आपकी अपेक्षा के अनुसार काम करते हैं :

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

सिंटैक्स (या थिमेल्फ़ ट्यूटोरियल) की त्वरित व्याख्या के लिए इसे देखें ।

अस्वीकरण : StackOverflow नियमों द्वारा आवश्यक के रूप में, मैं Thymeleaf के लेखक हूँ।


ठीक है लेकिन मैं ग्राहक के प्रकार (यानी अनाम या लॉग इन) के आधार पर एक जावास्क्रिप्ट आमंत्रित करता हूं ...
लकी

1
"टेक्स्ट इनलाइनिंग" पर अध्याय देखें, विशेष रूप से thymeleaf.org/documentation.html में "Thymeleaf" ट्यूटोरियल का उपयोग करके "जावास्क्रिप्ट इनलाइन" अनुभाग
डैनियल फर्नांडीज

और मैं कैसे कर सकते हैं वें: itter.index मान पर स्विच करें? मैं ऐसे मामलों का एक सेट करना चाहता हूं जब मूल्य <5 है, और डिफ़ॉल्ट मामले पर स्विच करें यदि मान> 5 है
लॉस एंजिल्स कोडर

@ DanielFernández: क्या आप कृपया मुझे stackoverflow.com/questions/48499723/… के साथ मदद कर सकते हैं । मैं आपको सीधे सवाल पर टैग नहीं कर सकता। वास्तव में अटक गया।
जेटी

98

मैंने इस कोड को यह जानने की कोशिश की कि क्या कोई ग्राहक लॉग इन या अनाम है। मैं का उपयोग कर किया था th:ifऔर th:unlessसशर्त भाव। यह करने के लिए बहुत आसान तरीका है।

<!-- 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
यह ओपी के सवाल का जवाब नहीं देता है क्योंकि यह जटिल अभिव्यक्तियों की नकल करने से बचने के बारे में था। और अन्य समाधानों की तरह, यह "प्राकृतिक टेम्पलेट्स" विचार को तोड़ता है, जो थाइमेलफ का एक प्रमुख विक्रय-बिंदु है। यह सुनिश्चित नहीं है कि इसके बारे में क्या करना है, लेकिन अगर कोई इसका जवाब देना चाहता है तो बस इसे इंगित करना चाहता है।
स्टीफन हैरिसन

@ यह मुझे एक त्रुटि देता है EL1007E: (स्थिति 0): संपत्ति या क्षेत्र 'स्थिति' नहीं मिल सकती है
जेसी

@ जैकी उपरोक्त उदाहरण में ग्राहक एक वस्तु है और ग्राहक वर्ग में गुमनाम क्षेत्र है। सुनिश्चित करें कि आपकी वस्तु शून्य नहीं है और फ़ील्ड नाम सही है।
लकी

25

मैं डैनियल फर्नांडीज के अलावा सुरक्षा से संबंधित अपना उदाहरण साझा करना चाहता हूं।

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

यहाँ मिश्रित 'प्रमाणीकरण' और 'प्राधिकरण' उपयोगिता ऑब्जेक्ट्स के साथ जटिल अभिव्यक्ति है जो थाइमेलफ टेम्पलेट कोड के लिए 'सही / गलत' परिणाम पैदा करता है।

'ऑथेंटिकेशन' और 'ऑथराइजेशन' यूटिलिटी ऑब्जेक्ट थिएमेलिएफ एक्स्ट्रा स्प्रिंग्ससिटी 3 लाइब्रेरी से आए थे । जब 'प्रमाणीकरण' वस्तु उपलब्ध नहीं होती है या प्राधिकरण.प्रयोग। ('IsAuthenticated ()') 'गलत' का मूल्यांकन करता है, तो अभिव्यक्ति $ {झूठी}, अन्यथा $ {true} वापस आ जाती है।


19

आप उपयोग कर सकते हैं

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

उदाहरण:

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

यह एक ही प्रश्न पूछने वाले नए लोगों के लिए उपयोगी हो सकता है।


11

एक अन्य समाधान - आप स्थानीय चर का उपयोग कर सकते हैं:

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

स्थानीय चर के बारे में अधिक जानकारी:
http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#local-variables


मुझे लगता है कि आपने अपने कोड में एक अतिरिक्त "=" चिन्ह जोड़ा है। कृपया इसे फिर से सत्यापित करें और सही होने पर इसे सही करें।
भाग्यशाली

मेरी राय में कोड ठीक है। मुझे नहीं पता कि आप कौन से अतिरिक्त '=' चिन्ह का मतलब है।
जर्क

हाँ कोड ठीक है। क्षमा करें, मैंने इसे उलझन में डाल दिया th:eachकि अभिव्यक्ति की :जगह कहां है=
लकी

लेकिन यह जवाब मेरे समाधान के बहुत करीब है। वें करते समय: अभिव्यक्ति के साथ मुझे बेमानी लगता है। मूल रूप से यह समाधान th: if और th: का उपयोग करता है, जब तक कि सशर्त विवरण नहीं।
लकी

मुझे लगता है कि यह बेमानी नहीं है। यदि आप केवल वें का उपयोग करते हैं: यदि और वें: जब तक कि जटिल अभिव्यक्ति को दो बार निष्पादित नहीं किया जाएगा ...
jareks

9

सरल मामले में (जब html टैग समान हों):

<h2 th:text="${potentially_complex_expression} ? 'Hello' : 'Something else'">/h2>

क्या आप जानते हैं कि इस अभिव्यक्ति में 'हैलो' और 'कुछ और' के अनुवाद कैसे जोड़ें?
लौरा

@ लॉरा आप अंतर्राष्ट्रीयकरण का उपयोग कर सकते हैं और गुण फ़ाइल से स्थान के आधार पर विभिन्न भाषा अनुवाद लोड कर सकते हैं। देखें looksok.wordpress.com/tag/internationalization , marcelustrojahn.com/2016/12/...
लकी

7

एक और समाधान सिर्फ notविपरीत नकार पाने के लिए उपयोग कर रहा है:

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

जैसा कि डॉक्यूमेंटेशन में बताया गया है , यह प्रयोग करने जैसी ही बात है th:unless। जैसा कि अन्य उत्तरों ने समझाया है:

इसके अलावा, th:ifएक व्युत्क्रम विशेषता है, th:unlessजिसका उपयोग हम ओजीएनएल अभिव्यक्ति के अंदर नहीं करने के बजाय पिछले उदाहरण में कर सकते हैं

उपयोग करना notभी काम करता है, लेकिन IMHO के th:unlessसाथ स्थिति को नकारने के बजाय उपयोग करने के लिए यह अधिक पठनीय है 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

th:switchएक के रूप में उपयोग करेंif-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>

th:switchएक के रूप में उपयोग करेंswitch

<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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.