我有一个具有标准页面布局的应用程序和许多内容模板。每个内容模板都可以有一个或多个我想视为片段的内容部分。我希望能够迭代每个片段,并在放入格式化div后单独包含它。这个想法是,我不希望每个内容页面都必须知道如何嵌套部分和div标签以使页面正确格式化。我尝试了以下方法,但没有成功:
布局.html:
<html xmlns:th="http://www.thymeleaf.org"
th:fragment="layout(contentFragments)">
<section class="row-outer-sm"
th:each="frag,iterStat : ${contentFragments}">
<div class="container">
<div class="row justify-content-center">
<div class="col">
<div th:if="${iterStat.first}"
th:replace="fragments/messages :: messages">
Messages go here
</div>
<div th:replace="${frag}">
Content goes here.
</div>
</div>
</div>
</div>
</section>
</html>
内容.html:
<html lang="en"
xmlns:th="http://www.thymeleaf.org"
th:replace="fragments/layout :: layout(~{:: div.section-content})">
<div class="section-content">
Some things for my first section
</div>
<div class="section-content">
Some things for my second section
</div>
</html>
content.html中的片段表达式正确地找到了所有带有section-content类的div,但是它们似乎是作为一个单独的连接片段传递到layout.html的。有什么方法可以得到我可以用于“th:each”标签的片段列表吗?
这不是一个特别优雅的解决方案,但我认为它可以满足您的需求。它重新安排了您的方法,因此可能需要根据您的特定上下文进行一些翻译。
这有点脆弱,因为您必须维护一个区段计数(解释如下)。
layout.html
:
<html xmlns:th="http://www.thymeleaf.org"
th:fragment="layout">
<section class="row-outer-sm"
th:each="i,iterStat : ${#numbers.sequence(1, 3)}"
th:with="section=${'section-' + i}">
<div class="container">
<div class="row justify-content-center">
<div class="col">
<div th:if="${iterStat.first}">
Messages go here
</div>
<div th:replace="~{/content.html :: __${section}__} ">
Content goes here.
</div>
</div>
</div>
</div>
</section>
</html>
content.html
:
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<div th:fragment="section-1">
<div class="section-content">
Some things for my first section
</div>
</div>
<div th:fragment="section-2">
<div class="section-content">
Some things for my second section
</div>
</div>
<div th:fragment="section-3">
<div class="section-content">
Some things for my third section
</div>
</div>
</html>
布局模板基于 Thymeleaf 的序列生成器构建动态创建的片段选择器section_n
,其中 n
是迭代值:
${#numbers.sequence(1, n)}
这是脆弱的部分 - 您必须记住将 n 的硬编码值与内容模板中部分片段的数量(和名称!
我们还使用Thymeleaf的预处理__${}__
指令来允许th:替换
对字符串-模板选择器进行操作。
在我的示例中,最终结果是HTML(格式有点不稳定):
<section class="row-outer-sm">
<div class="container">
<div class="row justify-content-center">
<div class="col">
<div>
Messages go here
</div>
<div>
<div class="section-content">
Some things for my first section
</div>
</div>
</div>
</div>
</div>
</section>
<section class="row-outer-sm">
<div class="container">
<div class="row justify-content-center">
<div class="col">
<div>
<div class="section-content">
Some things for my second section
</div>
</div>
</div>
</div>
</div>
</section>
<section class="row-outer-sm">
<div class="container">
<div class="row justify-content-center">
<div class="col">
<div>
<div class="section-content">
Some things for my third section
</div>
</div>
</div>
</div>
</div>
</section>
希望这会有所帮助,或者至少会给你一些启发。