ztree 异步加载模式下,节点无法取到子节点数组?
ztree吧
全部回复
仅看楼主
level 1
rngwxd 楼主
hi, 大家好。我碰到个奇怪的问题。ztree 3.5,使用ajax获取节点数据,一切都ok。
然后我想加载完一个节点的子节点并动态刷新之后,在onclick的callback函数里边,获取该节点的底下所有子节点数组。大致代码如下
function reLoadNode(event, treeId, treeNode) {
var zTree = $.fn.zTree.getZTreeObj("tree");
var type = "refresh";
var silent = true;
if(treeNode){
zTree.reAsyncChildNodes(treeNode, type);
if (!silent) zTree.selectNode(treeNode);
console.debug(treeNode);
console.debug(treeNode.children);
}
}
var setting = {
async: {
enable: true,
url:getAsyncUrl,
dataFilter: ajaxDataFilter
},
callback: {
onClick: reLoadNode
}
};
$.fn.zTree.init($("#tree"), setting);
现在问题在于,在reLoadNode callback里头,我 通过 console.debug(treeNode); 查看整个treeNode object,是可以在firebug的控制台里边,看到里边有children属性,并且是有值的,但是随后的 console.debug(treeNode.children); 却在debug里边只显示一个空数组,即 treeNode.children 取不到
正确的
值 (见抓图)
第一个抓图是展开后的treeNode里边的属性,显示是有children,且有值(包含2个子节点)
第二个抓图是js执行的结果,显示treeNode.children 返回的是个空数组
现在ajax加载子节点是ok的,就是这部分js很是让人不解。。。
哪位高手指点一下,谢谢!
2013年02月22日 05点02分 1
level 1
rngwxd 楼主
我还尝试过多种方式,比如 type不设置为refresh,设置为add(按照demo中的写法),这个时候,第一次onclick的时候,treeNode.children依然显示空数组[],第二次click的时候,显示有内容,第三次也有,但此时页面上,子节点却重复累加了,显然也不是我想要的。。。
我该怎么办呢?
2013年02月22日 05点02分 2
level 1
给你看下我的demo吧 也是异步加载的 希望能帮到你
//树结构载入时的属性
var setting = {
async: {
enable: true,
url : '/admin/showTreeNode.shtml',
autoParam:["treenodeId"],
dataFilter: filter,
dataType: 'json'
},
callback: {//回调函数,在这里可做一些回调处理
onClick: zTreeOnClick
},
//获取数据时节点Id和父id对应json的属性名,rootPId 为根节点的id
data: {
simpleData: {
enable : true,
idKey : "treenodeId",
pIdKey : "treenodeParentid",
rootPId: 0
},
//显示节点名称时对应的json数据里面的属性
key: {
name: "treenodeName"
}
}
};
//异步请求返回数据的处理
function filter(treeId, parentNode, childNodes) {
if (!childNodes) return null;
return childNodes;
}
//点击事件
function zTreeOnClick(event, treeId, treeNode) {
var zTree = $.fn.zTree.getZTreeObj("permission_tree");
zTree.reAsyncChildNodes(treeNode,"refresh",true);
}
$(document).ready(function(){
$.fn.zTree.init($("#permission_tree"), setting);
});
2013年02月22日 09点02分 3
level 1
rootPId 为根节点的父节点id 呵呵 ,打错了
2013年02月22日 09点02分 4
level 11
使用异步加载时,一定要在 onAsyncSuccess 中获取最新的数据哟。
2013年02月23日 15点02分 5
您好,能问下这个获取最新的数据是什么意思吗,明明节点信息中有children属性,怎么会取不到呢[泪]
2014年11月18日 02点11分
level 1
rngwxd 楼主
谢谢作者回答,我试试看。后续再反馈
2013年02月25日 07点02分 6
请问,楼主怎么解决的
2015年04月07日 03点04分
level 1
rngwxd 楼主
经测试,可以了。。。[真棒]
2013年02月25日 07点02分 7
level 1
onclick 函数只是一个操作函数,并不是类似 ”回调“ 那样的函数,所以当第一次点击时,没有数据是正常的,当第二次点击时,数据已经加载完毕,自然也就能够获取到了,所以要想从第一次获取数据,就要从onAsyncSuccess这个函数中去获取,这才是真正的回调函数。
2017年09月14日 06点09分 8
1