zTree removeNode 方法的问题,通过copyNode复制的节点无法成功删除

牛孝祖 发布于 2014/10/11 15:22
阅读 1K+
收藏 0

通过上面的方法添加了自定义控件,点击添加按钮时执行copyNode 成功拷贝节点,然后再点新节点的删除 调用removeNode 第一次无法删除,调试的时候看到 执行完 removeNode 后节点消失, 刷新后又回来了, 再次删除就成功了

function addDiyDom(treeId, treeNode) {
		
		    var node = $("#"+treeNode.tId+"_a");
		    
		    //加入所有自定义属性和默认值
		    var treeNode = $.extend({},nodeDefProperty,treeNode);
		    
		    /**节点描述信息**/
		    var addStr = "<span class='inputDescription'>"+treeNode.inputDescription+"</span>";
            node.after(addStr);
            //子节点可继续添加
		    if(treeNode.canAddChildren){
		        var addStr = "<span class='button add' id='addBtn_" + treeNode.tId
                + "' title='add node' onfocus='this.blur();'></span>";
                node.after(addStr);
                var btn = $("#addBtn_"+treeNode.tId);
                if (btn) btn.bind("click", function(){
                    var zTree = $.fn.zTree.getZTreeObj(treeId);
                    zTree.copyNode(treeNode.children[0],treeNode.children[0],"prev",true );
                    return false; 
                });
		    }
		    //节点可被删除
		    if(treeNode.canRemove){
		        var removeStr = "<span class='button remove' id='removeBtn_" + treeNode.tId
                + "' title='remove node' onfocus='this.blur();'></span>";
                node.after(removeStr);
                var btn = $("#removeBtn_"+treeNode.tId);
                if (btn) btn.bind("click", function(){
                    //删除有问题 
                    var zTree = $.fn.zTree.getZTreeObj(treeId);
                    if(treeNode.getParentNode().children.length>1)
                    {
                        zTree.removeNode(treeNode);
                        zTree.refresh();
                    }else{
//                        zTree.copyNode(treeNode,treeNode,"prev",false);
//                        zTree.removeNode(treeNode);
                    }
                    
                    return false;
                });
		    }
		    
		    //带有输入框的节点
		    if(treeNode.isInputNode){
		        addInputForNode(treeNode);
		    }
		    
		}




加载中
0
zTree
zTree

1. 请记住 copy 后的节点 会clone 出新的 节点 json 数据在 zTree 中! 所以 删除的时候务必要注意!

2. 你所说的刷新是怎么回事儿? 是怎么个刷新?  是后台没有正常删除? 还是前端的节点数据没有正常删除? 理论上用 removeNode 方法删除节点的话,肯定会被删除的

牛孝祖
您好!感谢回答我的问题!! 刷新是通过zTree api refresh() 刷新的 不用copy 删除是正常的,使用copy复制的节点 第一次删除不成功,refresh()后会显示回来 会不会是我执行那个extend函数的问题
0
牛孝祖

引用来自“zTree”的评论

1. 请记住 copy 后的节点 会clone 出新的 节点 json 数据在 zTree 中! 所以 删除的时候务必要注意!

2. 你所说的刷新是怎么回事儿? 是怎么个刷新?  是后台没有正常删除? 还是前端的节点数据没有正常删除? 理论上用 removeNode 方法删除节点的话,肯定会被删除的

你好,我想了想,变通了下方式,通过下面这样就能正常删除了
                if (btn) btn.bind("click", function(event){
                    
                    //删除有问题 
                    var zTree = $.fn.zTree.getZTreeObj(treeId);
                    var treeNode = zTree.getNodeByTId(event.srcElement.id.substring(10));
                    if(treeNode.getParentNode().children.length>1)
                    {
                        zTree.removeNode(treeNode);
                        zTree.refresh();
                    }else{
//                        zTree.copyNode(treeNode,treeNode,"prev",false);
//                        zTree.removeNode(treeNode);
                    }
                    
                    return false;
                });
我的js掌握了一点皮毛,这些机制还不是很熟。是不是我绑定的匿名方法的问题
牛孝祖
回复 @zTree : O.O 谢谢!懂了
zTree
zTree
回复 @牛孝祖 : 不行, 调用 zTree 方法操作节点时, treeNode 必须是 zTree 内的 节点对象,因为是直接 obj === obj 这种方法比较的
牛孝祖
回复 @zTree : 哦 zTree对象操作treeNode的时候用到了哪些关键属性 保证那些属性不变可以吗
zTree
zTree
注意两个关键问题: 1、使用 zTree 方法处理节点时,一定要保证该节点数据是 zTree 内部的节点 数据, 所以一般用 getNode...等方法获取是最合适的 2、注意函数中操作的对象。。。回调给你传入了 treeNode ,可是你在里面又把 treeNode 变成了一个新的对象。。。这样就导致后面的操作使用了一个非 zTree 内部的节点数据对象,从而操作失败
返回顶部
顶部