Оглавление

9 Локальные переменные


Thymeleaf называет локальными переменными те переменные, которые определены для определенного фрагмента шаблона и доступны только для выполнения внутри этого фрагмента.

Пример, который мы уже видели, это переменная prod на нашей странице списка продуктов:

<tr th:each="prod : ${prods}">
    ...
</tr>

Эта переменная prod будет доступна только в пределах тега <tr>. В частности:

  • Она будет доступна для любых других атрибутов th:*, выполняющихся в этом теге, с меньшим приоритетом, чем th:each (что означает, что они будут выполняться после th:each).
  • Она будет доступна для любого дочернего элемента тега <tr>, такого как любые элементы <td>.

Thymeleaf предлагает вам способ объявить локальные переменные без итерации, используя атрибут th:with, а его синтаксис — как указание значений атрибутов:

<div th:with="firstPer=${persons[0]}">
  <p>
    The name of the first person is <span th:text="${firstPer.name}">Julius Caesar</span>.
  </p>
</div>

Когда th:with обработается, эта переменная firstPer создается как локальная переменная и добавляется к списку переменных, исходя из контекста, так что она доступна для выполнения вместе с любыми другими переменными, объявленными в контексте, но только в пределах содержащего тега <div>.

Вы можете определить несколько переменных одновременно, используя обычный синтаксис множественного присваивания:

<div th:with="firstPer=${persons[0]},secondPer=${persons[1]}">
  <p>
    The name of the first person is <span th:text="${firstPer.name}">Julius Caesar</span>.
  </p>
  <p>
    But the name of the second person is 
    <span th:text="${secondPer.name}">Marcus Antonius</span>.
  </p>
</div>

Атрибут th:with позволяет повторно использовать переменные, определенные в одном и том же атрибуте:

<div th:with="company=${user.company + ' Co.'},account=${accounts[company]}">...</div>

Давайте использовать это на нашей домашней странице Grocery! Помните код, который мы написали для вывода форматированной даты?

<p>
  Today is: 
  <span th:text="${#calendars.format(today,'dd MMMM yyyy')}">13 february 2011</span>
</p>

Ну а что, если мы хотим, чтобы @dd MMMM yyyy@ зависела от локали? Например, мы могли бы добавить следующее сообщение в наш home_en.properties:

date.format=MMMM dd'','' yyyy

… и эквивалент home_es.properties

date.format=dd ''de'' MMMM'','' yyyy

Теперь давайте использовать th:with, чтобы получить локализованный формат даты в переменной, а затем использовать его в нашем th:text выражении:

<p th:with="df=#{date.format}">
  Today is: <span th:text="${#calendars.format(today,df)}">13 February 2011</span>
</p>

Это было чисто и легко. Фактически, учитывая тот факт, что th:with имеет более высокий приоритет, чем th:text, мы могли бы решить все это в теге span:

<p>
  Today is: 
  <span th:with="df=#{date.format}" 
        th:text="${#calendars.format(today,df)}">13 February 2011</span>
</p>

Вы могли бы подумать: Приоритет? Мы еще не говорили об этом! Ну, не волнуйтесь, потому что это именно то, о чем идет речь в следующей главе.

Комментарии (0)