Як робити, якщо інше в чебрецю?


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>

в 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}".

Важливим є те, що я використовую два різні теги HTML: скажімо, h2і span.

Чи можете ви запропонувати кращий спосіб досягти цього?

Відповіді:


208

Чебрець має еквівалент <c:choose>та <c:when>: атрибути 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.


нормально, але як я посилаюсь на javascript на основі типу клієнта (тобто анонімного або входу в систему) ...
Lucky

1
Дивіться розділ "Введення тексту", зокрема розділ "Вкладене в JavaScript" у підручнику "Використання чебрецю" в thymeleaf.org/documentation.html
Даніель Фернандес

І як я можу зробити це: увімкнути значення iterator.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
Це не відповідає на питання ОП, оскільки мова йшла про уникнення дублювання складних виразів. Як і інші рішення, це порушує ідею "природних шаблонів", яка є головною точкою продажу Чебрецю. Не впевнений, що з цим робити, але просто хотів вказати на той випадок, якщо хтось має відповідь.
Стівен Гаррісон

@Lucky це дає мені помилку EL1007E: (поз. 0): Неможливо знайти властивість або поле "Статус"
Jesse

@Jackie У наведеному вище прикладі клієнт є об'єктом, а анонім - булевим полем у класі клієнта. Переконайтеся, що ваш об’єкт не є нульовим, а ім'я поля правильним.
Пощастило

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>

Тут є складний вираз із змішаними об'єктами утиліти «автентифікація» та «авторизація», що дає результат «true / false» для коду шаблону.

Об'єкти утиліти «аутентифікація» та «авторизація» надходили з бібліотеки вим’ятових додатків springsecurity3 . Якщо об’єкт 'аутентифікація' недоступний АБО авторизація.expression ('isAuthentication ()') оцінюється як 'false', вираз повертає $ {false}, інакше $ {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де вираз :замість цього=
Lucky

Але ця відповідь дуже близька до мого рішення. Хоча це роблю: з виразом мені здається зайвим. В основному це рішення використовує th: if і th: якщо не умовні заяви.
Пощастило

Я думаю, що це не зайве. Якщо ви використовуєте тільки th: if і th: якщо складний вираз не буде виконуватися двічі ...
jareks

9

У більш простому випадку (коли теги HTML однакові):

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

Чи знаєте ви, як додати переклади для 'Привіт' та 'Щось інше' до цього виразу?
Лаура

@Laura Ви можете використовувати інтернаціоналізацію та завантажувати різні мовні переклади на основі розташування з файлу властивостей. Дивіться 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який ми могли б використовувати в попередньому прикладі замість використання виразу OGNL

Використання 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
<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>

введіть тут опис зображення


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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.