For each operator in Thymeleaf

2020-03-08 07:33发布

问题:

I can not find syntax for building simple for-each-loop in Thymeleaf template. I'm not satisfied with just th:each="" attribute, because it copies tag in which it's located.

What I'm looking for is something like:

<th:foreach th:each="...">
...block to be repeated...
</th>

what is analogue of <c:forEach items="..." var="..."> or <t:loop source="..." value="..."> in Tapestry. Is anything similar for that?

回答1:

Use th:block as stated in the Thymeleaf guide

th:block is a mere attribute container that allows template developers to specify whichever attributes they want. Thymeleaf will execute these attributes and then simply make the block disappear without a trace.

So it could be useful, for example, when creating iterated tables that require more than one <tr> for each element:

<table>
   <th:block th:each="user : ${users}">
      <tr>
         <td th:text="${user.login}">...</td>
         <td th:text="${user.name}">...</td>
      </tr>
      <tr>
         <td colspan="2" th:text="${user.address}">...</td>
      </tr>
   </th:block>
</table>


回答2:

The th:block solution is definitely the best one, but alternatively you can also try using th:remove="tag" in order to remove the containing tag:

<table>
   <tbody th:each="user : ${users}" th:remove="tag">
      <tr>
         <td th:text="${user.login}">...</td>
         <td th:text="${user.name}">...</td>
      </tr>
      <tr>
         <td colspan="2" th:text="${user.address}">...</td>
      </tr>
   </tbody>
</table>

The benefit of this approach is that you can also pass a Thymeleaf expression to th:remove in order to only remove the tag conditionally, e.g. if you want only some users to be included in a <tbody>, besides having other interesting uses.

Here is the documentation for th:remove.