关于addNodes的小问题
@zTree 你好,想跟你请教个问题:
我在使用ztree时,由于只修改前端,后端请求等不能修改,所以异步加载节点时,不是使用url的方式,自己通过beforeExpand将数据请求过来,再转换成ztree的节点实现的,今天突然发现了一个问题,就是点击+号展开树节点时,然后树节点展开后又自动关闭了,反复测试调了几个小时,最后确定了是addNodes方法的问题,感觉是由于数据返回过快而造成的,通过延时执行可以解决。附上测试代码:
// 树节点展开前触发事件 function beforeExpand(treeId, treeNode, treeBase) { if (treeNode.hasAsynced) { return true; } if (!treeNode.isAsyncing) { ajaxGetNodes(treeId, treeNode, "refresh", treeBase); return true; } else { windowUtil.tip("正在获取数据中,请稍后展开节点。"); return false; } } // 异步加载子节点 function ajaxGetNodes(treeId, treeNode, reloadType, treeBase) { var zTree = $.fn.zTree.getZTreeObj(treeId); if (reloadType == "refresh") { treeNode.icon = baseUrl + "/visual/js/lib/zTree_v3/css/zTreeStyle/img/loading.gif"; zTree.updateNode(treeNode); } treeNode.isAsyncing = true; treeBase.asyncGetChildren(treeNode, function(nodes) { treeNode.hasAsynced = true; delete treeNode.isAsyncing; treeNode.icon = ""; zTree.updateNode(treeNode); zTree.addNodes(treeNode, nodes); return; // 通过延时可解决问题 setTimeout(function() { zTree.addNodes(treeNode, nodes); }, 10); }, function() { windowUtil.tip("异步获取数据出现异常。"); delete treeNode.hasAsynced; delete treeNode.isAsyncing; treeNode.icon = ""; zTree.updateNode(treeNode); }); } // 异步获取指令父节点的子节点对象 // @param parentNode 父节点 // @param successCallback 获取成功回调函数 // @param failedCallback 获取失败回调函数 treeBase.prototype.asyncGetChildren = function(parentNode, successCallback, failedCallback) { // 直接返回数据,用于测试 successCallback([{id: "1", text: "test", pId: parentNode.id}]); };
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
没用。不过我用另一种方式解决了,zTree.addNodes(treeNode, nodes, true);给最后一个参数设置true就可以了。感谢你的回答。
beforeExpand 中 触发你的 异步加载时, 就不要return true了,直接return false 试试看