繁体   English   中英

Thymeleaf递归不起作用

[英]Thymeleaf recursion not working

我正在尝试使用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>

谁能发现为什么这可能不起作用?

问题的原因是

您正尝试th:text并尝试将描述添加到<li>以及您尝试th:include将片段包含在同一标记<li>

你的th:includeth:text替换为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>
 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM