Thymeleaf 3片段表达可能有哪些类型的操作和语法?

时间:2017-07-19 06:59:03

标签: thymeleaf

使用Thymeleaf 3,可以通过~{:: selector}语法将片段从页面传递到模板。

该对象可以进行哪种操作?

片段可以在表达式中使用:

<div th:fragment="name(arg)">
  <div th:replace="${arg} :? _"></div>
</div>

我是否可以使用类似的方式提取片段内部分片段(以下是不正确的语法!!):

<div th:fragment="name(arg)">
  <div th:replace="${arg :: script} :? _"></div>
  <div th:replace="${arg}.filter('script'} :? _"></div>
  <div th:replace="${xpath(${arg},'script')} :? _"></div>
</div>

UPDATE 我内省了解决了什么片段表达式:

<th:block th:text="${bodyContent.class}" />

org.thymeleaf.standard.expression.Fragment。它有:

<th:block th:text="${bodyContent.templateModel.class}" />

TemplateModel可以通过toString()write(Writer writer)呈现。我没有看到过滤Fragment内容的简便方法......

1 个答案:

答案 0 :(得分:0)

我看到了我尝试使用的Thymeleaf templates - Is there a way to decorate a template instead of including a template fragment?技术。

Thymeleaf v2.1和3允许将模板/片段混合引用到自身。

让我们看看模板:

<html lang="en" xmlns:th="http://www.thymeleaf.org">
    <body>
       <nav></nav>
       <div th:replace="this :: body"/>
    </body>
</html>

和页面:

<html lang="en" xmlns:th="http://www.thymeleaf.org"
      th:replace="thymeleaf/layout/default :: html">
    <body>
       XXX
    </body>
</html>

上面的代码生成无限序列<body><nav></nav>作为CSS选择器从模板引用到body的模板。

要移动对页面的引用,我添加了更复杂的CSS样式选择器:

<html lang="en" xmlns:th="http://www.thymeleaf.org" class="htmlFrag">
    <body>
       <nav></nav>
       <div th:replace="this :: html[!class]/body"/>
    </body>
</html>

我不确定如何将模板和页面放在相同的范围内以进行选择器匹配,但它有效......

使用CSS / JS处理的高级模板可以表示为:

<html lang="en" xmlns:th="http://www.thymeleaf.org" class="htmlFrag">
    <head>
       <meta charset="UTF-8">
       <meta name="viewport" content="width=device-width, initial-scale=1.0">

       <title th:text="~{::html[!class]/head/title/text()}"></title>

       <link rel='stylesheet' href='/webjars/...">
       <div th:replace="this :: html[!class]/head/link"/>

       <script src="/webjars/..."></script>
       <div th:replace="this :: html[!class]/head/script"/>
    </head>
    <body>
       <nav></nav>
       <div th:replace="this :: html[!class]/body"/>
    </body>
</html>

更新我得到了开发者https://github.com/thymeleaf/thymeleaf/issues/626

的答复

Thymeleaf使用基于拉取或基于片段包含的布局架构或默认情况。

使用Layout Dialect可以使用分层布局样式,并且最好这样做。