থাইমালিফ-এ অন্য কীভাবে করবেন?


132

থিমলেফ if- elseএ কোনও সরল করার সর্বোত্তম উপায় কী ?

আমি থিমলেফের মতো একই প্রভাব অর্জন করতে চাই

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

জেএসটিএল এ।

আমি এতক্ষণ যা ভেবে দেখেছি:

<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

থাইমালিফের একটি সমতুল্য <c:choose>এবং রয়েছে <c:when>: থাইমালিফ ২.০ এ প্রবর্তিত th:switchএবং th:caseগুণাবলী।

*ডিফল্ট কেসটি ব্যবহার করে আপনি প্রত্যাশা মতো এগুলি কাজ করে :

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

দেখুন এই বাক্য গঠন একটি দ্রুত ব্যাখ্যা (অথবা Thymeleaf টিউটোরিয়াল) জন্য।

দাবি অস্বীকার: স্ট্যাকওভারফ্লো বিধি অনুসারে, আমি থাইমালিফের লেখক।


ঠিক আছে তবে .. আমি কীভাবে গ্রাহকের ধরণের (যেমন নামবিহীন বা লগ ইন করা হয়েছে) এর ভিত্তিতে জাভাস্ক্রিপ্ট চালু করতে পারি ...
ভাগ্যবান

1
, উপর "পাঠ্য ইনলাইনিং" অধ্যায় দেখুন বিশেষভাবে "ব্যবহার করে Thymeleaf" এ অধ্যায় "জাভাস্ক্রিপ্ট ইনলাইনিং" টিউটোরিয়ালে thymeleaf.org/documentation.html
ড্যানিয়েল ফার্নান্দেজ

এবং আমি কীভাবে করতে পারি: একটি পুনরুক্তিকারী সূচক মানটি স্যুইচ করুন? আমি যখন মান <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 ()') 'মিথ্যা' তে মূল্যায়ন করে, এক্সপ্রেশনটি $ {মিথ্যা returns, অন্যথায় {সত্য} প্রদান করে}


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# স্থানীয়- পরিবর্তনশীল


আমি মনে করি আপনি আপনার কোডটিতে একটি অতিরিক্ত "=" সাইন যোগ করেছেন। দয়া করে এটি আবার যাচাই করুন এবং আমি সঠিক হলে এটি সংশোধন করুন।
ভাগ্যবান

আমার মতামত কোড ঠিক আছে। আপনি কোন অতিরিক্ত '=' সাইন বলতে চাইছেন তা আমি জানি না।
jareks

হ্যাঁ কোড ঠিক আছে। দুঃখিত, আমি th:eachঅভিব্যক্তিটির :পরিবর্তে যেখানে এটি দিয়ে বিভ্রান্ত করেছি=
লাকী

তবে এই উত্তরটি আমার সমাধানের খুব কাছাকাছি। করার সময়: অভিব্যক্তিটি আমার কাছে অপ্রয়োজনীয় মনে হয়। মূলত এই সমাধানটি th: if এবং th: শর্তাধীন বিবৃতি না থাকলে ব্যবহার করে।
ভাগ্যবান

আমি মনে করি এটি অনর্থক নয়। আপনি যদি কেবলমাত্র th: if এবং th ব্যবহার করেন: যদি না জটিল অভিব্যক্তি দু'বার কার্যকর করা হয় ...
জেরکس

9

সহজ ক্ষেত্রে (যখন এইচটিএমএল ট্যাগ একই থাকে):

<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করেও কাজ করে, তবে আইএমএইচও এটির 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>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.