问题
I don't know how to deal with recursive array in template.and I can't find anything in handlebarsjs's docs
there are my codes: js:
var branch = [{ name:"firstLayerNodeA", has_branch:true, branch:[{ name:"secondLayoutNodeA", has_branch:false },{ name:"secondLayoutNodeB", has_branch:true, branch:[{ name:"thirdLayerNodeA", has_branch:true, branch:[{ //fourth Layer //fifth Layer //..... }] }] }] },{ name:"firstLayerNodeB", has_branch:false }]
html
<Template name="tree"> <ul> {{#each brach}} <li> name {{#if has_branch}} <ul> {{#each brach}} <li> name {{#if has_brach}} {{#each brach}} .....third layer .....fourth layer .... {{/each}} {{/if}} </li> {{/each} </ul> {{/if}} </li> {{/each}} </ul> </Template>
There are good ideas that deal with branch in template? Any help is appreciated.
回答1:
You can use nested templates:
client side js
Template.tree.branch = function() {
var branch = ...
return branch;
}
Html
<template name="tree">
<ul>
{{#each branch}}
<li>
{{>branch}}
</li>
{{/each}}
</ul>
</template>
<template name="branch">
{{name}}
{{#if branch.length}}
<ul>
{{#each branch}}
<li>
{{>branch}}
</li>
{{/each}}
</ul>
{{/if}}
</template>
Also you don't really need has_branch
. Just check the length of the branch array instead as each will only loop if its an array and theres stuff in there
回答2:
Akshat's answer is very good.
However, using it I had some problems with the event handling. The event was catched several times; once for every instances of the branch
template that contained the element throwing the event.
Not sure whether this is a bug or a feature...anyway I could overcome it using:
Template.branch.events({
'click': function (e,b) {
console.log("this will show up as often as deep your tree is");
if (this._id==b.data._id)
console.log("this will show up only once");
}
});
来源:https://stackoverflow.com/questions/15290670/how-to-use-recursive-template