首先你方法
function addNewNode(d, item) {
d._children = d._children || [];
d._children = d._children.concat(item);
}
应该是:
function addNewNode(d, item) {
item.forEach(function(i){
if(d._children)
d._children.push(i)//will add child to the closed node
else
d.children.push(i)//will add child to expanded node.
})
}
接下来我保持一个标志数据,以表明它并不需要通过上单击ajax加载。
{
"name": "flare",
"loaded" : true, //so this node flare will not be loaded on click via ajax
"children": [
{
"name": "analytics",
"loaded" : true,//so this node analytics will not be loaded on click via ajax
"children": [...
最后在我的点击函数中,只有当这个标志是未定义的时候才会加载。
.on("click", function(d) {
if (d.loaded === undefined) {\\do ajax
setTimeout(function() {
var newItem;
newItem = [{
"name": "i am new",
"children": [{
"name": "i am new child 1"
}, {
"name": "i am new child 2"
}]
}];
addNewNode(d, newItem);
d.loaded = true;//mark it as loaded so it doesn't load next time
console.log("called", d)
toggle(d);
update(d);
}, 1000)
} else {//already loaded so dont do ajax
toggle(d);
update(d);
}
});
工作代码here
如果你想要加载的节点都要塌了。
您创建一个新的节点是这样的:
newItem = [{
"name": "i am new",
"children": [{
"name": "i am new child 1"
}, {
"name": "i am new child 2"
}]
}];
取而代之的是做
newItem = [{
"name": "i am new",
"_children": [{ //note its changed to _children to show collapsed
"name": "i am new child 1"
}, {
"name": "i am new child 2"
}]
}];
工作代码here
希望这有助于!