[英]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.