49

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 the 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 an analogue of <c:forEach items="..." var="..."> or <t:loop source="..." value="..."> in Tapestry. Is anything similar for that?

2 Answers 2

96

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>
Sign up to request clarification or add additional context in comments.

1 Comment

I don't see the difference to my implementation ... any idea why it' s not working for me?
15

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.

2 Comments

th:remove is what I guessed about, but didn't tried yet :-) Thank you a lot.
@ekemchitsiga was the first one, so his answer will be accepted. And +1 to you too :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.