字符串标题
String parent
id | title | parent |
1 | Clothes | 0 |
2 | Men | 1 |
3 | Shoes | 2 |
4 | Adidas | 3 |
如何在这种情况下递归循环
我需要这个
衣服
-Men
--shoes
---阿迪达斯
----可能太长了
答案 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/