异步加载如何增加根节点
ztree吧
全部回复
仅看楼主
level 4
jiemyonline 楼主
首先我使用的是异步加载节点。首先选取一个节点,然后按增加按钮,会通过ajax提交后,再回调函数里使用下面两行刷新新节点,会正常出现。然,我现在希望若不选择一个节点就按增加节点按钮的话,它会加成level=0的根层的节点,可是,我不知道如何处理了,因为找不到reAsyncChildNodes里面需要的上层节点了。。。
//使用这个可以刷新出正常选取节点情况下添加的新节点
vAddNodeParent.isParent=true;
zTree.reAsyncChildNodes(vAddNodeParent,"refresh");
基本构造如下:
var zTree ;
var zNodes =[{name:"root", id:"1",pid:"0",isParent:true}];
setting = {
isSimpleData : true,
treeNodeKey : "id",
treeNodeParentKey : "pid",
// rootPID : 0,
editable : true,
dragCopy : false,
dragMove : true ,
edit_removeBtn : false,
edit_renameBtn : false,
//asyncDataFilter: ajaxDataFilter,
nameCol:"name",
async: true,
asyncParam : ["name"],
asyncUrl: getUrl,
callback: {
beforeDrag: zTreeBeforeDrag,
asyncSuccess: zTreeAjaxSuccess,
click: zTreeClick
}
};
zTree = $("#tree").zTree(setting, zNodes);
希望得到帮助,告诉我如何在service增加成功后,页面如何刷新出根节点。

2011年07月26日 03点07分 1
level 4
jiemyonline 楼主
谢谢您的回复。
我的需求仅仅是希望加一个level=0的节点。就是第一层节点。
我初始化的时候,level=0的节点只有一个,即我的tree看起来有一个node,他的pid=0,level=0,然后异步加载会展开。
然后我是每次点选一个节点后,点增加按钮,填写name后,通过ajax提交新加节点,在server端我将原来选中的节点后面加载上新加的节点那层的数据后返回,然后使用reAsyncChildNodes更新之前选中的节点。这样新加的节点就会展现出来。异步加载使用addNodes不管用。
但是,我现在希望再增加一个level=0的那层的节点,按照上面的逻辑,我找不到一个之前要选中的父节点了。您可以帮我指点一下,如何在异步加载的环境下,增加level=0的节点吗?
万分感谢。

2011年07月27日 02点07分 3
level 4
jiemyonline 楼主
谢谢您的讲解。不过我还有点问题请教。
addNodes可以了。真奇怪,之前addNodes就不行。
reAsyncChildNodes的增加功能zTreeObj.reAsyncChildNodes(parentNode, "add");,我用了之后,父节点下面的子节点会多出来一倍……不知您说的增加功能是这个不是?
$("#buttonTest").click(function(){
var vAddNodeParent= zTree.getSelectedNode();
var vNew=[{id:1000,level:1,name:"XXX",isParent:false,pid:1,aid:0}];
zTree.addNodes(vAddNodeParent,vNew);
vNew.name="PPP";
zTree.updateNode(vNew,false);//这句不更新……
});
请您帮我看看,为何上面这段代码的updateNode不起作用。我运行后,仍然是增加了一个XXX,没变成PPP

2011年07月27日 05点07分 5
level 4
jiemyonline 楼主
非常感谢。刚才在做addNodes时Server端返回的时候我也发现这个数组问题了。
再次感谢您。
2011年07月27日 06点07分 7
level 4
jiemyonline 楼主
刚才我测试updateNode这个方法,发现我给定一个数据结构已经在zTree中存在的节点如下,
var vGetNode={id:29,level:0,name:"发00",isParent:false,pid:0,aid:0};
vGetNode.name="PPP";
zTree.updateNode( vGetNode,false);
他不会更新,但是如果通过
var vGetNode=zTree.getSelectedNode();
vGetNode.name="PPP";
zTree.updateNode( vGetNode,false);
就管用,不太理解为什么,还望指点。
期待v3.0的发布啊!!!
支持!!!

2011年07月27日 07点07分 9
level 4
jiemyonline 楼主
您说的已经非常清晰了。谢谢。
这个问题已经明白了。
不过不好意思我还想提问,真是不好意思……一天问了这么多……
就是我们在zTree = $("#tree").zTree(setting,[]);初始化的时候,如果初始节点是[],并且setting的async是false,那么这个是可以通过的,并且后续可以通过addNodes增加节点。
但是,如果async是true,并且Server端一开始就没数据返回,那么$("#tree").zTree(setting,[]);就会出错,js无法执行下去了。
这个是要根据初始节点的数量去设定setting的async是false来解决吗?因为异步下,不是false程序走不下去了。
如果是这样,要先变更setting的async,然后updateSetting还要。然后有增加节点了,再把setting的async改回成true…… 有更好的方式吗你觉得?

2011年07月27日 08点07分 11
level 4
jiemyonline 楼主
谢谢你的帮助。
测试全部完成。
后面会要学习一下你的源码。
有问题再请教了。
感谢。
2011年07月28日 00点07分 13
1