#thymeleaf
#thymeleaf
Вопрос:
В Thymeleaf я хотел бы сгенерировать следующий HTML
<span data-my-attr>
</span>
Я хотел бы отобразить data-my-attr
условно, но, похоже, нет способа отображать или НЕ отображать пустой атрибут условно.
В случае required
атрибута есть th:required
, но для пользовательских атрибутов ничего нет.
Я пытался использовать th:attr="'data-my-attr'=${value}"
и значение равно true
или false
, но это не работает.
Ответ №1:
Давайте предположим condition
true
, когда ваш атрибут должен отображаться, а false
когда нет. Вы можете иметь следующее:
<span data-my-attr th:attr="${condition} ? 'meaningless' : 'data-my-attr'=''"></span>
Объяснение:
Согласно этому потоку, когда вы указываете пустое значение для атрибута внутри th:attr
, Thymeleaf удалит этот атрибут. Итак, в приведенном выше фрагменте:
data-my-attr
добавляется по умолчанию.- Пустое значение присваивается атрибуту с помощью
th:attr
. - Имя атрибута, переопределенного пустым значением, выбирается соответственно
${condition}
. - When
${condition}
istrue
тогдаdata-my-attr
должно оставаться, поэтому следует выбрать любое бессмысленное имя (отсутствующее в теге). - В противном
data-my-attr
случае его следует удалить, чтобы было выбрано это имя.
Кажется странным, но такой способ удаления атрибута, похоже, работает с 2012 года. Поэтому я бы счел его стабильным.
Комментарии:
1. спасибо, ваше решение работает. Это хакерский и «трудный для чтения», но я думаю, что у нас нет ничего лучше в Thymeleaf.
2. @michal.jakubeczy Другой способ, о котором я подумал, это
<th:block th:if="{$condition}"><span data-my-attr></span></th:block><th:block th:unless="${condition}"><span></span></th:block>
. Менее сложный, но более подробный.3. да, конечно, это тоже вариант. Но недостатком является большая дублированность кода. Мне было интересно, почему
[(${expression ? 'data-my-attribute' : ''})]
внутренний элемент не работает. Это был бы отличный способ сделать это.4. Я думаю, что дублирования кода можно избежать, используя
th:fragment
. Но, конечно, упомянутое вами выражение было бы преимуществом. Возможно, было бы неплохо поднять проблему в репозитории Thymeleaf на github с запросом на поддержку условного добавления пользовательских «логических атрибутов».5. да, может быть хорошим. Поддерживается ли он по-прежнему, кстати?