Невозможно установить пустую строку в качестве значения для атрибута в тимелеф - PullRequest
0 голосов
/ 27 апреля 2020

Я передаю java объект в тимелист. Но объект содержит другой объект, и вот где я получаю проблему. В моем java коде у меня есть следующее:

context.setVariable("person",getPerson());

В классе Person есть перечисление, из которого я могу сделать следующее:

person.getEnum().getDescription();

Это мой лист чабреца xml:

<MyTag th:attr="Description=${person.getEnum()!=null} ? ${#objects.nullSafe(person.getEnum().getDescription(),'')} : '',Id=${person.getEnum()()!=null} ? ${#objects.nullSafe(person.getEnum()().getId(),'')} : ''"/>

Конечный результат, который я хочу получить:

< MyTag Desciption="" Id=""/>

Но все, что я получаю, это:

< MyTag/>

атрибуты полностью игнорируется Но установка пустого пространства, как показано ниже:

 <MyTag th:attr="Description=${person.getEnum()!=null} ? ${#objects.nullSafe(person.getEnum().getDescription(),' ')} : '',Id=${person.getEnum()()!=null} ? ${#objects.nullSafe(person.getEnum()().getId(),'')} : ' '"/>

приведет к следующему:

< MyTag Desciption=" " Id=" "/>

Как я могу получить первый упомянутый результат без этого пустого пространства?

1 Ответ

0 голосов
/ 27 апреля 2020

ОБНОВЛЕНИЕ :

Подход Thymeleaf if не будет работать для ситуации ОП. Поэтому единственный другой подход, который я могу предложить, - это использовать JavaScript (в данном случае jQuery):

Предположим, MyTag может быть присвоен класс в дополнение к другому необходимому контенту:

<MyTag class="myClass"...></MyTag>

Затем используйте basi c Thymeleaf - не пытайтесь учесть нули.

Затем используйте jQuery, чтобы "заполнить пробелы атрибутов, для тех случаев, когда их еще нет значение для соответствующего атрибута - например:

<script>
    $(document).ready(function () {
      $( ".myClass" ).each(function() {
        if ( ! $( this ).attr("Description") ) {
          $( this ).attr("Desciption", "");
        }
      });  
    });
</script>

Таким образом, DOM будет включать атрибут следующим образом:

<MyTag class="myClass" Description="" ...></MyTag>

Это может быть расширено, чтобы охватить другие атрибуты по мере необходимости .

Оригинальный подход - не может использоваться OP :

Единственный способ, которым я знаю, как это сделать с помощью Thymeleaf:

Использовать if вернуться к обычному HTML, если это ситуация «все или ничего» (т. е. если все атрибуты, которые вы хотите использовать, равны нулю или все они не равны нулю).

Это Ситуация в вопросе - так что, возможно, это все, что вам нужно.

Пример:

Запуск с простым компонентом Name, содержащим 3 поля: первое, среднее и последнее, у нас есть эти данные:

Map<String, Object> model = new HashMap();
List<Name> names = new ArrayList();
names.add(new Name("John", "Jack", "Smith"));
names.add(new Name("Fred", null, "Jones"));
model.put("names", names);
ctx.render("names.html", model);

Используя следующий Thymeleaf ...

<th:block th:each="name : ${names}">
    <th:block th:if="${name.middle} == null">
        <div middle="" 
             th:text="${name.first} + ' ' + ${name.last}">
        </div>
    </th:block>
    <th:block th:if="${name.middle} != null">
        <div th:attr="middle=${name.middle}" 
             th:text="${name.first} + ' ' + ${name.last}">
        </div>
    </th:block>
</th:block>

.. Мы получаем это HTML:

<div middle="Jack">John Smith</div>   
<div middle="">Fred Jones</div>    

Конечно, это не особенно гибко, как упомянуто выше. Например, метод jQuery .attr() возвращает undefined для отсутствующих атрибутов.

Side Примечание:

Вы можете заменить это:

th:attr="middle=${name.middle}"

с этим:

th:middle="${name.middle}"

Это даст вам тот же конечный результат.

Конечная точка:

Опять же, не имеет прямого отношения к вашему вопросу, но ... Я было бы осторожно иметь атрибут "id" без значения. Используйте уникальное значение или не используйте атрибут "id".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...