条件 Thymeleaf 片段

use*_*200 3 thymeleaf

我想使用模板片段创建最多包含三个项目的列表。无论是否有项目,都会显示三个项目空格,所以看起来像这样。

<div>
  <div th:if="${#lists.size(block.children) > 0}"
    th:insert="code-block :: block(${block.children[0]})" 
    th:remove="tag">
  </div>
</div>;
<div>
  <div th:if="${#lists.size(block.children) > 1}"
    th:insert="code-block :: block(${block.children[1]})" 
    th:remove="tag">
  </div>
</div>;
<div>
  <div th:if="${#lists.size(block.children) > 2}"
    th:insert="code-block :: block(${block.children[2]})" 
    th:remove="tag">
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

但是,即使该th:if语句在空列表中评估为 false,它仍然尝试执行 `th:include 语句,给出以下错误:

Caused by: org.springframework.expression.spel.SpelEvaluationException:
EL1025E:(pos 14): The collection has '0' elements, index '0' is invalid
Run Code Online (Sandbox Code Playgroud)

如何使 if 语句优先于片段执行?

Met*_*ids 6

是的,不幸的是,由于include优先级高于if,因此您将不得不向上移动if。最简单的方法是将其放入 a 中th:block,如下所示:

<div>
  <th:block th:if="${#lists.size(block.children) > 0}">
    <div th:insert="code-block :: block(${block.children[0]})" th:remove="tag" />
  </th:block>
</div>;
<div>
  <th:block th:if="${#lists.size(block.children) > 1}">
    <div th:insert="code-block :: block(${block.children[1]})" th:remove="tag" />
  </th:block>
</div>;
<div>
  <th:block th:if="${#lists.size(block.children) > 2}">
    <div th:insert="code-block :: block(${block.children[2]})" th:remove="tag" />
  </th:block>
</div>
Run Code Online (Sandbox Code Playgroud)

您还可以简化您的代码,使其看起来更像这样:

<th:block th:each="i: ${#numbers.sequence(0, 2)}">
  <th:block th:if="${#lists.size(block.children) > i}">
    <div th:insert="code-block :: block(${block.children[i]})" th:remove="tag" />
  </th:block>

  <th:block th:unless="${i == 2}">;</th:block>
</th:block>
Run Code Online (Sandbox Code Playgroud)