提问者:小点点

你能迭代胸腺叶碎片列表吗?


我有一个具有标准页面布局的应用程序和许多内容模板。每个内容模板都可以有一个或多个我想视为片段的内容部分。我希望能够迭代每个片段,并在放入格式化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”标签的片段列表吗?


共1个答案

匿名用户

这不是一个特别优雅的解决方案,但我认为它可以满足您的需求。它重新安排了您的方法,因此可能需要根据您的特定上下文进行一些翻译。

这有点脆弱,因为您必须维护一个区段计数(解释如下)。

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>

希望这会有所帮助,或者至少会给你一些启发。