如何递归循环g:每个在表模型中

时间:2014-08-20 11:26:09

标签: loops grails

字符串标题
String parent

       id  |  title  |  parent  |
       1   | Clothes |     0    |
       2   |   Men   |     1    | 
       3   |  Shoes  |     2    |
       4   |  Adidas |     3    |

如何在这种情况下递归循环 我需要这个 衣服
-Men
--shoes
---阿迪达斯
----可能太长了

1 个答案:

答案 0 :(得分:0)

实现一个taglib方法,该方法负责处理复杂逻辑并输出一些可重用的HTML(最好是简单的)HTML。

首先让我们为演示目的定义一个简单的节点:

class Node {
    String title
    List<Node> children

    public boolean hasChildren() {
        return children as Boolean
    }
}

定义整个“产品树”:

def rootNodeDemo = new Node(title: 'clothes', children: [
    new Node(title:'men', children: [
        new Node(title: 'shoes', children: [
            new Node(title: 'adidas')
        ])
    ]),
    new Node(title: 'women', children: [
        new Node(title: 'shoes', children: [
            new Node(title: 'adidas')
        ])
    ])
])

这是taglib:

class NavigationTaglib {
    static namespace = "navigation"

    /**
     * @param rootNode - the root node from where to start rendering.
     */
    def productCategoryTree = { attrs, body ->
        def rootNode = attrs?.remove('rootNode') // this is the clothes -root node or maybe even the root of everything (which probably needs to be omitted in HTML-rendering)

        if(!rootNode) {
            return
        }

        out << renderTreeHtml(rootNode).toString()
    }

    private StringBuilder renderTreeHtml(Node rootNode) {
        StringBuilder treeHtml = new StringBuilder()

        treeHtml << """<ul class="navi node-level-1">"""

        treeHtml << renderTreeHtmlItems(rootNode, 2)

        treeHtml << "</ul>"
    }

    private StringBuilder renderTreeHtmlItems(Node node, int level) {
        StringBuilder treeHtml = new StringBuilder()

        treeHtml << """<li>${node.title?.encodeAsHTML()}"""

        if(node.hasChildren()) {
            treeHtml << """<ul class="node-level-${level}">"""

            node.children.each { Node child ->
                treeHtml << renderTreeHtmlItems(child, level+1)
            }

            treeHtml << "</ul>"
        }

        treeHtml << "</li>"
    }
}

在GSP中(我们假设模型有一个名为rootNodeDemo的条目,其中包含之前定义的rootNodeDemo的内容):

<navigation:productCategoryTree rootNode="${rootNodeDemo}" />

这将生成以下HTML,抱歉,没有像新行或标签那样漂亮的打印:(

<ul class="navi node-level-1"><li>clothes<ul class="node-level-2"><li>men<ul class="node-level-3"><li>shoes<ul class="node-level-4"><li>adidas</li></ul></li></ul></li><li>women<ul class="node-level-3"><li>shoes<ul class="node-level-4"><li>adidas</li></ul></li></ul></li></ul></li></ul>

当在Web浏览器中呈现时,看起来就像以下JS-fiddle中的内容:http://jsfiddle.net/bq4wkyc3/