使用“模板修饰而不是包含”技术时,如何检查Thymeleaf片段是否已定义?
在以下 template.html 示例中,我只希望在定义片段时呈现script标签
<html th:fragment="page" xmlns:th="..."> ... <div class="container" th:include="this :: content"></div> <script th:include="this :: script"></script> ... </html>
但是在我的使用上面模板的 index.html 中,没有定义脚本片段,但是script标签仍然会渲染
<html th:include="template :: page"> ... <div th:fragment="content"> ... </div> </html>
我尝试过th:if="#{this :: script}"但没有运气
th:if="#{this :: script}"
我在Thymeleaf玩了一点(…),这是我的结论。
在下文中,我将使用tag任何给定的标签(div,script,span等)和fragment可接受的片段语法(this :: script,this :: content,template :: #menu等)
tag
div
script
span
fragment
this :: script
this :: content
template :: #menu
当您使用时<tag th:include="fragment"/>,Thymeleaf始终会生成一个<tag>...</tag>。如果不存在,则内容为空<tag></tag>。如果片段存在,则内容变为片段的内容。例如<div th:"other :: #foo/>用于片段<p id="foo">bar</p>给出<div>bar</div>
<tag th:include="fragment"/>
<tag>...</tag>
<tag></tag>
<div th:"other :: #foo/>
<p id="foo">bar</p>
<div>bar</div>
当您使用时<tag th:replace="fragment"/>,Thymeleaf尝试将其替换为完整的片段,包括标记。有以下特殊情况:
<tag th:replace="fragment"/>
th:fragment="id"
th:fragment
<p th:fragment="foo">bar</p>
<p>bar</p>
因此,如果您只想在<script>片段存在时就包含该片段,则只需通过<script th:fragment ...>...</script>其存在来对其进行标识,并通过以下方式将其包含在布局中:
<script>
<script th:fragment ...>...</script>
<script th:replace="this :: script"/>