level 4
首先我使用的是异步加载节点。首先选取一个节点,然后按增加按钮,会通过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 11
如果想重新加载根节点,那么 只需要 zTree.reAsyncChildNodes(null,"refresh"); 即可。
不过不知道你的具体需求,刷新根节点,基本上等于你的树重新加载,是否有这个必要呢?
2011年07月26日 10点07分
2
level 4
谢谢您的回复。
我的需求仅仅是希望加一个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 11
level=0的节点 父节点是null,所以只需要设置parentNode参数为null即可。 对于 reAsyncChildNodes 和 addNodes 都有效。 你这种只是增加节点,可以利用reAsyncChildNodes 的 增加功能,而不是默认的刷新操作。
2011年07月27日 02点07分
4
level 4
谢谢您的讲解。不过我还有点问题请教。
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 11
是这样的,reAsyncChildNodes 如果你使用的是增加模式,那么要保证生成的数据只是新增的,而不要有已经显示了的数据。
否则你还是使用addNodes 吧!
另外你的代码严重错误, vNew 是个Array,vNew[0]才是那个数据对象,
应该是vNew[0].name = "PPP"; ztree.updateNode(vNew[0], false);
2011年07月27日 06点07分
6
level 4
非常感谢。刚才在做addNodes时Server端返回的时候我也发现这个数组问题了。
再次感谢您。
2011年07月27日 06点07分
7
level 11
不用客气, 在v3.0中 addNodes 是可以直接只添加一个json对象了,如果只添加一个节点,不用必须做成Array了
2011年07月27日 06点07分
8
level 4
刚才我测试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 11
据个例子: var a = {id:1}
假设第一部你把这个a节点加入到了zTree内部,那么zTree内部就有了这个对象的引用,就相当于 b = a b.id == 1
这时候 你直接修改 a.id = 2 那么b.id 也会是2;
但如果你这么写 a = {id:2} 那么b.id 还是1,因为你没有改变原先a对应的对象的id值,你只是生成了一个新的id为2的对象赋给a,所以 a != b
zTree中的机制是寻找zTree内部的节点数据进行更新,你重新生成了一个新的对象,那么在zTree的数据中是无法找到的,所以也就无法更新了。
另外,v3.0我相信还是提高很多,但是大家又要适当重新学习一下,尤其setting的结构会有很大的改动。
2011年07月27日 07点07分
10
level 4
您说的已经非常清晰了。谢谢。
这个问题已经明白了。
不过不好意思我还想提问,真是不好意思……一天问了这么多……
就是我们在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 11
是这样的,初始化zTree的时候,会判断根节点是否存在,如果根节点不存在并且设置了异步加载模式,那么就会自动去进行异步加载。
但是我试过, 初始化[],服务器返回空字符串,不会出错,只不过树没有任何节点而已,而且之后的zTree1.reAsyncChildNodes(null, "refresh"); 方法运行非常正常。请你在检查检查吧。
2011年07月27日 09点07分
12
level 4
谢谢你的帮助。
测试全部完成。
后面会要学习一下你的源码。
有问题再请教了。
感谢。
2011年07月28日 00点07分
13