Thymeleaf 中的有条件关闭标签

And*_*niy 7 spring conditional spring-mvc thymeleaf

我需要有条件地关闭Thymeleaf模板中的标签。说,在迭代一些元素集合期间,我必须将其中一些元素的系列包装成单个<div>

<div>...element1, element2, element3...</div>
<div>...element4...</div>
<div>...element5, element6...</div>
Run Code Online (Sandbox Code Playgroud)

如果存在某种有条件的标记关闭方式,则可以将其存档。但我显然不能写</div th:if="...">。如果是的话,jsp我可以很容易地写出类似的东西:

<%if (condition) {%></div><%}%>
Run Code Online (Sandbox Code Playgroud)

任何想法如何解决这个问题?

编辑准确地说,我的元素不仅仅是字符串,它们是复杂的内部 html 块。

Tob*_*ías 6

我认为最好将数据表示为单独的列表,正如您在之前的回答中提到的那样

但即使出于好奇,也有一个丑陋的解决方法来实现类似于<%if (condition) {%></div><%}%>您所问的类似的东西。

诀窍是将标签生成为转义文本:

<th:block th:if="${openTagCondition}" th:utext="'&lt;div&gt;'" /> 

<th:block th:if="${colseTagCondition}" th:utext="'&lt;/div&gt;'" /> 
Run Code Online (Sandbox Code Playgroud)

这只是出于好奇。我不建议使用此解决方法,因为它非常不可读,损害可维护性,并且您可能会留下不平衡的标签。


And*_*niy 1

我找到了解决方法。应包装成单个块的系列块<div>应表示为模型内的单独列表。比如说,我有Element一堂课描述了我的element街区。所以,我的模型应该是这样的:

List<Element> elementGroups

我必须为它创建双循环:

<div th:each="group : ${elementGroups}">
    <th:block th:each="element : ${group}">
       ...
    </th:block>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言,这不是问题的答案。当然你可以这样做。但在控制器级别对列表进行分组并不总是可行的。我认为这通常是一个视图问题,最好在视图(模板)级别完成。附:我不是反对者,也不会反对你对自己问题的回答,但如果我是你,我会接受托比亚斯的答案而不是这个。 (2认同)