th:替换不适合th:在Thymeleaf

时间:2017-10-31 09:32:49

标签: spring-boot thymeleaf

根据 Thymeleaf docs

  

片段可以包含任何th:*属性。一旦片段被包含到目标模板(具有th:insert / th:replace 属性的模板)中,将评估这些属性,并且它们将能够引用此目标中定义的任何上下文变量模板。

我的片段

<div th:fragment="link">
    <a th:href="@{${url}}"><span th:inline="text">[[${text}]]</span></a>
</div>

这是我加入它的方式。

<div th:replace="fragments/common :: link" th:with="url='www.google.com', text='Click Me'"></div>

我得到的HTML

<a href="">
    <span>null</span>
</a>

但是同样适用于th:include并且可以使用HTML。

<a href="www.google.com">
    <span>Click Me</span>
</a>

为什么th:replace 工作th:inlcude工作正常?

注意: th:insert超出范围,因为我使用Thymeleaf v2.1.5

2 个答案:

答案 0 :(得分:4)

原因是th:replace实际上删除了当前标记,因此您丢失了那里的每个属性,但是从片段中获取了所有属性。在您的情况下,这意味着您从未在范围中定义任何th:with变量。th:include的工作方式相反。您松散了片段标记,但保留了布局中定义的所有内容。

考虑这个片段:

<fragmenttag th:fragment="link" style="background-color: red">...</fragmenttag>

布局:

<layouttag th:include="fragments/common :: link" style="font-size: 250%;"/>
<layouttag th:replace="fragments/common :: link" style="font-size: 250%;"/>

结果是:

&#13;
&#13;
<layouttag style="font-size: 250%;">Some Text</layouttag>
<fragmenttag style="background-color: red">Some Text</fragmenttag>
&#13;
&#13;
&#13;

如果您想使用th:replace,因为片段中有一些重要属性,您可以在布局中的某个父标记中定义所需的所有内容。

<body th:with="url='www.google.com', text='Click Me'">
    <div th:replace="fragments/common :: link" ></div>
</body>

您正在引用帖子中的文档:

  

片段可以包含任何th:*属性。这些属性将是   一旦将片段包含在目标模板中(   一个与th:insert / th:replace属性),他们将能够   引用此目标模板中定义的任何上下文变量。

我不会在这里看到任何矛盾,因为这部分文档是关于:片段中的属性。

  

片段(th:片段部分)可以包含任何th:*属性。

在您的问题中,您正在谈论放弃目标模板中定义的*属性。但无论如何,这部分是相当严格的,你首先执行包含逻辑

  

一旦包含片段

,将对评估这些属性

这里没有任何内容可以让您假设您将获得在目标模板或片段主标签中定义的所有内容,因为它们都可以根据您要使用的包含策略进行替换(th:insert / th:替换)。

所以你定义了th:with="url='www.google.com', text='Click Me'"属性,但它从未包含在最终结果模板中,因为你选择了th:replace包含策略,所以th:with属性从未被评估过,你没有{{1} }和url范围内的变量。这里没有矛盾。

答案 1 :(得分:0)

似乎是一个类似(不相同)的问题,感谢this post

中的一个问题

作为此问题的解决方法,您仍然可以使用th:include,然后使用div删除额外的th:remove="tag",例如:

<div th:include="fragments/common :: link" th:with="url='www.google.com', text='Click Me'" th:remove="tag"></div>