Làm thế nào để làm if-other trong Thymeleaf?


132

Cách tốt nhất để làm một cách đơn giản if- elsetrong Thymeleaf là gì?

Tôi muốn đạt được trong Thymeleaf hiệu quả tương tự như

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

trong JSTL.

Những gì tôi đã tìm ra cho đến nay:

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

Tôi không muốn đánh giá potentially_complex_expressionhai lần. Đó là lý do tại sao tôi giới thiệu biến cục bộ condition. Tôi vẫn không thích sử dụng cả hai th:if="${condition}th:unless="${condition}".

Một điều quan trọng là tôi sử dụng hai thẻ HTML khác nhau: giả sử h2span.

Bạn có thể đề xuất một cách tốt hơn để đạt được nó?

Câu trả lời:


208

Thymeleaf có một tương đương với <c:choose><c:when>: các thuộc tính th:switchth:caseđược giới thiệu trong Thymeleaf 2.0.

Chúng hoạt động như bạn mong đợi, sử dụng *cho trường hợp mặc định:

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

Xem phần này để được giải thích nhanh về cú pháp (hoặc hướng dẫn về Thymeleaf).

Tuyên bố miễn trừ trách nhiệm : Theo yêu cầu của quy tắc StackOverflow, tôi là tác giả của Thymeleaf.


ok nhưng..làm thế nào để tôi gọi một javascript dựa trên loại khách hàng (nghĩa là ẩn danh hoặc đăng nhập) ...
Lucky

1
Xem chương về "Nội dung văn bản", cụ thể là phần "Nội tuyến JavaScript" trong hướng dẫn "Sử dụng Thymeleaf" trong thymeleaf.org/documentation.html
Daniel Fernández

Và làm thế nào tôi có thể làm th: bật một giá trị iterator.index? Tôi muốn làm một bộ trường hợp khi giá trị là <5, và chuyển sang trường hợp mặc định nếu giá trị là> 5
Loser Coder

@ DanielFernández: bạn có thể vui lòng giúp tôi với stackoverflow.com/questions/48499723/ không . Tôi không thể gắn thẻ bạn vào câu hỏi trực tiếp. Thực sự bị mắc kẹt.
cầu tàu

98

Tôi đã thử mã này để tìm hiểu xem khách hàng đã đăng nhập hay ẩn danh. Tôi đã sử dụng các biểu thức th:ifth:unlessđiều kiện. Cách khá đơn giản để làm điều đó.

<!-- 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
Điều này không trả lời câu hỏi của OP vì đó là về việc tránh trùng lặp các biểu thức phức tạp. Và giống như các giải pháp khác, điều này phá vỡ ý tưởng "các mẫu tự nhiên", một điểm bán hàng chính của Thymeleaf. Không biết phải làm gì về bản thân mình, nhưng chỉ muốn chỉ ra trong trường hợp ai đó có câu trả lời.
Stephen Harrison

@Lucky điều này cho tôi một lỗi EL1007E: (pos 0): Không thể tìm thấy thuộc tính hoặc trường 'Trạng thái'
Jesse

@Jackie Trong ví dụ trên, khách hàng là một đối tượng và ẩn danh là trường boolean trong lớp Khách hàng. Hãy chắc chắn rằng đối tượng của bạn không rỗng và tên trường là chính xác.
May mắn

25

Tôi muốn chia sẻ ví dụ của tôi liên quan đến bảo mật ngoài Daniel Fernández.

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

Dưới đây là biểu thức phức tạp với các đối tượng tiện ích 'xác thực' và 'ủy quyền' hỗn hợp tạo ra kết quả 'đúng / sai' cho mã mẫu của thymeleaf.

Các đối tượng tiện ích 'xác thực' và 'ủy quyền' đến từ thư viện lò xo bổ sung của thymeleaf . Khi đối tượng 'xác thực' không khả dụng HOẶC ủy quyền.expression ('isAuthenticated ()') ước tính thành 'false', biểu thức trả về $ {false}, nếu không $ {true}.


19

Bạn có thể dùng

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

Thí dụ:

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

Nó có thể hữu ích cho những người mới hỏi cùng một câu hỏi.


11

Một giải pháp khác - bạn có thể sử dụng biến cục bộ:

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

Tìm hiểu thêm về các biến cục bộ:
http://www.thymeleaf.org/doc/tutorials/2.1/USEthymeleaf.html#local-variables


Tôi nghĩ rằng bạn đã thêm một dấu "=" trong mã của mình. Vui lòng xác minh lại và sửa nếu tôi đúng.
May mắn

Theo ý kiến ​​của tôi mã là ok. Tôi không biết ý nghĩa nào thêm '='.
jareks

Vâng, mã là ok. Xin lỗi, tôi đã nhầm lẫn nó với th:eachbiểu thức có :thay vì=
May mắn

Nhưng câu trả lời này rất gần với giải pháp của tôi. Trong khi làm th: với biểu hiện có vẻ dư thừa đối với tôi. Về cơ bản giải pháp này sử dụng th: if và th: trừ khi các câu điều kiện.
May mắn

Tôi nghĩ nó không dư thừa. Nếu bạn chỉ sử dụng th: if và th: trừ khi biểu thức phức tạp sẽ được thực thi hai lần ...
jareks

9

Trong trường hợp đơn giản hơn (khi các thẻ html giống nhau):

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

Bạn có biết cách thêm bản dịch cho 'Xin chào' và 'Cái gì khác' trong biểu thức này không?
Laura

@Laura Bạn có thể sử dụng quốc tế hóa và tải các bản dịch ngôn ngữ khác nhau dựa trên vị trí từ tệp thuộc tính. Xem looksok.wordpress.com/tag/i quốc tế hóa , marcelustrojahn.com/2016/12/ trên
Lucky

7

Một giải pháp khác chỉ là sử dụng notđể có được sự phủ định ngược lại:

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

Như đã giải thích trong tài liệu , nó giống như sử dụng th:unless. Như những câu trả lời khác đã giải thích:

Ngoài ra, th:ifcó một thuộc tính nghịch đảo th:unless, mà chúng ta có thể đã sử dụng trong ví dụ trước thay vì sử dụng không nằm trong biểu thức OGNL

Sử dụng notcũng hoạt động, nhưng IMHO nó dễ đọc hơn để sử dụng th:unlessthay vì phủ nhận điều kiện với 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>

nhập mô tả hình ảnh ở đây


1

Sử dụng th:switchnhư mộtif-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>

Sử dụng th:switchnhư mộtswitch

<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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.