我在同一模板文件中包含了一个模板片段。文档的“8.1 Including template fragments - Defining and referencing fragments”部分指出:
“ :: domselector ”或“ this :: domselector ”包含来自的片段 相同的模板。
如果我没有误解,我应该可以按如下方式引用该片段:th:include="this :: contentB"
或th:include=":: contentB"
但只有完整参考th:include="test-fragment :: contentB"
才适合我。
这是示例代码:
HomeController.java
@Controller
class HomeController {
@RequestMapping({ "/", "index", "home" })
String index(Model model) {
return "test";
}
}
的test.html
<!DOCTYPE html>
<html>
<head></head>
<body>
<ul th:replace="test-fragment :: contentA" />
</body>
</html>
测试fragment.html
<!DOCTYPE html>
<html>
<head></head>
<body>
<ul th:fragment="contentA">
<li th:each="idx : ${#numbers.sequence(1,4)}" th:switch="${idx}">
<th:block th:case="1"
th:include="test-fragment :: contentB"
th:with="strVar = 'One'"/>
<th:block th:case="2"
th:include="this :: contentB"
th:with="strVar = 'Two'"/>
<th:block th:case="3"
th:include=" :: contentB"
th:with="strVar = 'Three'"/>
<th:block th:case="*"
th:include="/test-fragment :: contentB"
th:with="strVar = 'Other'"/>
</li>
</ul>
<span th:fragment="contentB">
<span th:text="|value: ${strVar}|" />
</span>
</body>
</html>
输出是:
<!DOCTYPE html>
<html>
<head></head>
<body>
<ul>
<li><span>value: One</span></li>
<li></li>
<li></li>
<li><span>value: Other</span></li>
</ul>
</body>
</html>
案例2和3缺失。我究竟做错了什么?
我正在使用Spring Boot 1.3.2.RELEASE
进行测试编辑:
我已经制作了一个小型测试项目来重现这个问题,可以在这里找到:https://github.com/t-cst/thymeleaf-springboot-test
编辑:
经过一些调试后,我发现当片段选择器为"this :: contentB"
或" :: contentB"
时,模板名称将被解析为test
而不是test-framgent
。这可以在以下时间完成:
StandardFragment#extractFragment:189
- 2.1.4.RELEASE:
/* 186 */ String targetTemplateName = getTemplateName();
if (targetTemplateName == null) {
if (context != null && context instanceof Arguments) {
targetTemplateName = ((Arguments)context).getTemplateName();
/* 190 */ } else {
throw new TemplateProcessingException(
"In order to extract fragment from current template (templateName == null), processing context " +
"must be a non-null instance of the Arguments class (but is: " +
(context == null? null : context.getClass().getName()) + ")");
/* 195 */ }
}
但我仍然不知道为什么在我的测试中会发生这种情况。
编辑:
我也在thymeleaf forum问过。也许这是一个错误。我打开了issue。
答案 0 :(得分:2)
如果有人在此处以相同的问题结束,则thymeleaf 2.1.4.RELEASE
版本无法执行此操作,但它将在下一版3.0
中
可在此issue comment找到全面的解释。