使用“this :: content”或“:: content”包含来自同一百日咳模板的片段不能按预期工作

时间:2016-02-10 18:09:30

标签: java thymeleaf

我在同一模板文件中包含了一个模板片段。文档的“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。这可以在以下时间完成:

来自thymeleaf的

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

1 个答案:

答案 0 :(得分:2)

如果有人在此处以相同的问题结束,则thymeleaf 2.1.4.RELEASE版本无法执行此操作,但它将在下一版3.0

可在此issue comment找到全面的解释。