2017-04-19 61 views
0

我想用模板片段创建最多三个条目的列表。无论是否有物品,总会显示三个物品空间,因此它看起来像这样。有条件的百里香片段

<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> 

然而,即使th:if语句计算一个空列表为假,但仍尝试执行`日:include语句,给我下面的错误:

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

我怎样才能让if语句优先于片段执行?

回答

2

是的,不幸的是,由于include has precedence over if,你将不得不移动更高的if。最简单的办法是把它放在一个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> 

你也很可能简化你的代码看起来更象这样:

<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> 
+0

呵呵。 TIL关于th:块。谢谢您的帮助! – user1834200

+0

是的,如果可能的话,我会尽量遵守常规标签,但在这种情况下,有时候没有其他选择。 – Metroids