th:replace 不适用于 Thymeleaf 中的 th:with

Abd*_*han 3 thymeleaf spring-boot

根据百里香 docs

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

我的片段

<div th:fragment="link">
    <a th:href="@{${url}}"><span th:inline="text">[[${text}]]</span></a>
</div>
Run Code Online (Sandbox Code Playgroud)

这就是我包含它的方式。

<div th:replace="fragments/common :: link" th:with="url='www.google.com', text='Click Me'"></div>
Run Code Online (Sandbox Code Playgroud)

我得到的 html

<a href="">
    <span>null</span>
</a>
Run Code Online (Sandbox Code Playgroud)

然而,同样适用于th:include并给我以下 HTML。

<a href="www.google.com">
    <span>Click Me</span>
</a>
Run Code Online (Sandbox Code Playgroud)

为什么th:replace 工作正常时不起作用th:inlcude

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

var*_*ren 5

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

考虑这个片段:

<fragmenttag th:fragment="link" style="background-color: red">...</fragmenttag>
Run Code Online (Sandbox Code Playgroud)

和布局:

<layouttag th:include="fragments/common :: link" style="font-size: 250%;"/>
<layouttag th:replace="fragments/common :: link" style="font-size: 250%;"/>
Run Code Online (Sandbox Code Playgroud)

结果是:

<layouttag style="font-size: 250%;">Some Text</layouttag>
<fragmenttag style="background-color: red">Some Text</fragmenttag>
Run Code Online (Sandbox Code Playgroud)

如果你想使用th:replace,因为你在fragment中有一些重要的属性,你可以在布局中的一些父标签中定义你需要的一切。

<body th:with="url='www.google.com', text='Click Me'">
    <div th:replace="fragments/common :: link" ></div>
</body>
Run Code Online (Sandbox Code Playgroud)

您在帖子中引用了文档:

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

我在这里没有看到任何矛盾,因为这部分文档是关于 th:*片段内的属性。

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

在您的问题中,您正在谈论丢失目标模板中定义的 th:* 属性。但无论如何,这部分很困难,您首先执行包含逻辑

一旦包含片段,将评估这些属性

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

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