Thymeleaf递归不起作用

时间:2015-04-19 10:51:56

标签: html thymeleaf

我试图使用Thymeleaf创建一个递归列表。我使用一个简单的Java对象来建模一个节点,该节点有两个字段,一个描述,然后是子节点的数组列表。我使用以下HTML / Thymeleaf来处理结构,但它不会递归地迭代到下一级别。

我的Java代码如下所示:

public class Node {
    public String description;
    public ArrayList<Node> children;
}

我的Thymeleaf / HTML代码如下:

<html>
    ...
    <body>
        <div th:fragment="fragment_node" th:remove="tag">
            <ul th:if="${not #lists.isEmpty(node.children)}" >
                <li th:each="child : ${node.children}"
                    th:text="${child.description}"
                    th:with="node = ${child}"
                    th:include="this::fragment_node">List Item</li>
            </ul>
        </div>

    </body>
</html>

如果我的数据结构如下所示:

  • 主节点1
    • 子节点1
    • 子节点2
  • 主节点2
    • 子节点3
    • 子节点4

我希望得到:

<ul>
    <li>Main Node 1</li>
    <li>
        <ul>
            <li>Child node 1</li>
            <li>Child node 2</li>
        </ul>
    </li>
    <li>Main Node 2</li>
    <li>
        <ul>
            <li>Child node 3</li>
            <li>Child node 4</li>
        </ul>
    </li>
</ul>

然而,我只得到:

<ul>
    <li>Main Node 1</li>
    <li>Main Node 2</li>
</ul>

有人能说出为什么这可能不起作用吗?

1 个答案:

答案 0 :(得分:1)

问题的原因是

您正尝试th:text并尝试将说明添加到<li>,并尝试th:include同一标记<li>内的片段。< / p>

th:include取代th:text,因为th:text默认优先处理。

直接解决您的源代码

 .....
 <li th:each="child : ${node.children}" th:inline="text" th:with="node = ${child}">
      [[${child.description}]]
      <ul th:replace="this::fragment_node">List Item</ul>
 </li>
 .....

即使认为上述内容可以按照您的意愿运行,我个人也会在您的百万富翁页面中找到一些设计问题。

使用片段参数的更好解决方案

 ...
 <ul th:fragment="fragment_node(node)" th:unless="${#lists.isEmpty(node.children)}" >
     <li th:each="child : ${node.children}" th:inline="text">
         [[${child.description}]]
         <ul th:replace="this::fragment_node(${child})"></ul>
     </li>
 </ul>
 ...