ThymeLeaf Fragment在假的情况下执行:if

时间:2016-12-13 19:24:33

标签: spring-mvc spring-boot thymeleaf

我正在使用Thymeleaf与Spring-Boot一起打包。这是主要模板:

<div class="container">
    <table th:replace="fragments/resultTable" th:if="${results}">
        <tr>
            <th>Talent</th>
            <th>Score</th>
        </tr>
        <tr>
            <td>Confidence</td>
            <td>1.0</td>
        </tr>
    </table>
</div>

它使用了这个片段:

<table th:fragment="resultTable">
    <tr>
        <th>Talent</th>
        <th>Score</th>
    </tr>
    <tr th:each="talent : ${talents}">
        <td th:text="${talent}">Talent</td>
        <td th:text="${results.getScore(talent)}">1.0</td>
    </tr>
</table>

只有存在结果对象时,片段才有效。这对我来说很有意义。因此,基于documentation的语法,我将th:if语句添加到主模板文件中。但是,当我访问没有对象的模板时,我仍然会收到此错误

Attempted to call method getScore(com.model.Talent) on null context object

th:if语句不应该阻止访问该代码吗?

当填充结果对象时,模板仍然可以正常工作,但是如何在没有表的情况下渲染null case?

2 个答案:

答案 0 :(得分:8)

片段包含的运算符优先级高于th:if。

http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#attribute-precedence

你可能需要移动th:if到上面的标签。无论是在容器div中,还是如果你仍然需要容器div,那么就像这样一个th:block:

<div class="container">
    <th:block th:if="${results}">
        <table th:replace="fragments/resultTable">
            <tr>
                <th>Talent</th>
                <th>Score</th>
            </tr>
            <tr>
                <td>Confidence</td>
                <td>1.0</td>
            </tr>
        </table>
    </th:block>
</div>

答案 1 :(得分:0)

在Thymeleaf 3.0中,只有在满足条件的情况下,才可以使用无操作令牌插入/替换,如下所示:

<table th:replace="${results} ? ~{fragments :: resultTable} : _">

https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#advanced-conditional-insertion-of-fragments