开发问题:thymeleaf模版中 th:if 属性不生效的一种情况
本文发布于 2024年12月17日,阅读 25 次,点赞
0 次,归类于
开发问题记录
公众号:emanjusaka的编程栈
by emanjusaka from https://www.emanjusaka.com/archives/thymeleaf-if-error 彼岸花开可奈何
本文为原创文章,可能会更新知识点以及修正文中的一些错误,全文转载请保留原文地址,避免未即时修正的错误误导。
当属性th:if
和th: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
的条件为 false
,th: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>