开发问题:thymeleaf模版中 th:if 属性不生效的一种情况

本文发布于 2024年12月17日,阅读 25 次,点赞 0 次,归类于 开发问题记录

博客:https://www.emanjusaka.com

公众号:emanjusaka的编程栈

by emanjusaka from https://www.emanjusaka.com/archives/thymeleaf-if-error 彼岸花开可奈何

本文为原创文章,可能会更新知识点以及修正文中的一些错误,全文转载请保留原文地址,避免未即时修正的错误误导。

当属性th:ifth:replace一起使用时会导致th:if没有效果

例如下面这种错误的用法

 <th:block th:if="${_templateId == 'post'}" th:replace="~{modules/widgets/toc}"></th:block>

上面的问题在于 th:replace 的执行时机。

在 Thymeleaf 的处理流程中,th:replace 是在模板解析阶段执行的,而 th:if 是在渲染阶段执行的。

这意味着,即使 th:if 的条件为 falseth:replace 也可能已经在之前执行了替换操作。

在 Thymeleaf 中,如果你想要根据条件来决定是否替换某个部分,你应该将 th:if 放在被替换的片段内部,而不是放在包含 th:replace 的元素上。这样,只有当条件满足时,被替换的片段才会被渲染和包含进来。

可以这样修改代码:

 <!-- 在原始模板中 -->
 <th:block th:replace="~{modules/widgets/toc}"></th:block>
 <!-- 在 modules/widgets/toc.html 文件中定义一个名为 tocBlock 的片段 -->
     <th:block th:if="${templateId == 'post'}">
         <!-- 这里放置只有在 _templateId 为 'post' 时才显示的内容 -->
         <p>这是只有在模板ID为post时显示的段落。</p>
     </th:block>
 ​


本篇完