如何检查Thymeleaf片段已定义

时间:2014-07-04 12:58:52

标签: java spring thymeleaf

如何在使用"template decoration instead of inclusion" technique

时检查是否定义了Thymeleaf片段

template.html 的下面示例中,我只希望在定义片段时呈现脚本标记

<html th:fragment="page" xmlns:th="...">
  ...
  <div class="container" th:include="this :: content"></div>
  <script th:include="this :: script"></script>
  ...
</html>

但是在我的 index.html 中使用上面的模板,没有定义脚本片段,但脚本标记仍将呈现

<html th:include="template :: page">
  ...
  <div th:fragment="content">
    ...
  </div>
</html>

我已经尝试th:if="#{this :: script}"但没有运气

1 个答案:

答案 0 :(得分:1)

我和Thymeleaf玩了一点(...),这是我的结论。

在下文中,我将tag用于任何给定标记(divscriptspan等)和fragment可接受的片段语法(this :: scriptthis :: contenttemplate :: #menu等。)

当您使用<tag th:include="fragment"/>时,Thymeleaf会产生<tag>...</tag>。如果它不存在,则内容为空,显示<tag></tag>。如果片段存在,则内容将成为片段的内容。例如,使用<div th:"other :: #foo/>片段<p id="foo">bar</p>可以<div>bar</div>

当您使用<tag th:replace="fragment"/>时,Thymeleaf会尝试将其替换为包含完整片段的标记。以下特殊情况:

  • 如果片段不存在,Thymeleaf不会插入任何内容
  • 如果片段由th:fragment="id"标识,则Thymeleaf会删除th:fragment(例如:<p th:fragment="foo">bar</p>提供<p>bar</p>,无论tag是什么)。
  • 如果片段由dom元素标识,则Thymeleaf保留dom元素(例如:<p id="foo">bar</p>给出<p id="foo">bar</p>,无论tag是什么)

因此,如果您希望仅在<script>片段存在时添加<script th:fragment ...>...</script>片段,则必须在<script th:replace="this :: script"/> 存在时对其进行识别,并将其包含在您的布局中:

{{1}}