Thymeleaf — добавить атрибут без значения

#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 удалит этот атрибут. Итак, в приведенном выше фрагменте:

  1. data-my-attr добавляется по умолчанию.
  2. Пустое значение присваивается атрибуту с помощью th:attr .
  3. Имя атрибута, переопределенного пустым значением, выбирается соответственно ${condition} .
  4. When ${condition} is true тогда data-my-attr должно оставаться, поэтому следует выбрать любое бессмысленное имя (отсутствующее в теге).
  5. В противном 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. да, может быть хорошим. Поддерживается ли он по-прежнему, кстати?