簡體   English   中英

如何遞歸循環g:在表模型中的每個

[英]How to recursive loop g:each in a table model

字符串標題
字符串父母

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

在這種情況下我該如何遞歸循環
衣服

-鞋
---阿迪達斯
----可能太長

實現負責復雜邏輯並輸出一些(最好是簡單的) 可重用的 HTML的taglib方法。

首先,我們為演示目的定義一個簡單的Node:

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小提琴中的內容: http : //jsfiddle.net/bq4wkyc3/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM