ztree吧 关注:1,841贴子:12,480
  • 12回复贴,共1

异步加载如何增加根节点

只看楼主收藏回复

首先我使用的是异步加载节点。首先选取一个节点,然后按增加按钮,会通过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增加成功后,页面如何刷新出根节点。



IP属地:北京1楼2011-07-26 11:28回复
    如果想重新加载根节点,那么 只需要 zTree.reAsyncChildNodes(null,"refresh"); 即可。
    不过不知道你的具体需求,刷新根节点,基本上等于你的树重新加载,是否有这个必要呢?


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


      IP属地:北京3楼2011-07-27 10:09
      回复
        level=0的节点 父节点是null,所以只需要设置parentNode参数为null即可。 对于 reAsyncChildNodes 和 addNodes 都有效。 你这种只是增加节点,可以利用reAsyncChildNodes 的 增加功能,而不是默认的刷新操作。


        IP属地:北京4楼2011-07-27 10:44
        回复
          谢谢您的讲解。不过我还有点问题请教。
          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
          


          IP属地:北京5楼2011-07-27 13:56
          回复
            是这样的,reAsyncChildNodes 如果你使用的是增加模式,那么要保证生成的数据只是新增的,而不要有已经显示了的数据。
            否则你还是使用addNodes 吧!
            另外你的代码严重错误, vNew 是个Array,vNew[0]才是那个数据对象,
            应该是vNew[0].name = "PPP"; ztree.updateNode(vNew[0], false);
            


            IP属地:北京6楼2011-07-27 14:18
            回复
              非常感谢。刚才在做addNodes时Server端返回的时候我也发现这个数组问题了。
              再次感谢您。


              IP属地:北京7楼2011-07-27 14:29
              回复
                不用客气, 在v3.0中 addNodes 是可以直接只添加一个json对象了,如果只添加一个节点,不用必须做成Array了


                IP属地:北京8楼2011-07-27 14:57
                回复
                  刚才我测试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的发布啊!!!
                  支持!!!
                  


                  IP属地:北京9楼2011-07-27 15:20
                  回复
                    据个例子: 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的结构会有很大的改动。
                    


                    IP属地:北京10楼2011-07-27 15:38
                    回复
                      您说的已经非常清晰了。谢谢。
                      这个问题已经明白了。
                      不过不好意思我还想提问,真是不好意思……一天问了这么多……
                      就是我们在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…… 有更好的方式吗你觉得?
                      


                      IP属地:北京11楼2011-07-27 16:47
                      回复
                        是这样的,初始化zTree的时候,会判断根节点是否存在,如果根节点不存在并且设置了异步加载模式,那么就会自动去进行异步加载。
                        但是我试过, 初始化[],服务器返回空字符串,不会出错,只不过树没有任何节点而已,而且之后的zTree1.reAsyncChildNodes(null, "refresh"); 方法运行非常正常。 请你在检查检查吧。


                        IP属地:北京12楼2011-07-27 17:48
                        回复
                          谢谢你的帮助。
                          测试全部完成。
                          后面会要学习一下你的源码。
                          有问题再请教了。
                          感谢。


                          IP属地:北京13楼2011-07-28 08:41
                          回复