关于addNodes的小问题

mfkwgizhoujian 发布于 2016/01/06 15:07
阅读 232
收藏 0

@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}]);
};



加载中
0
zTree
zTree
beforeExpand 中 触发你的 异步加载时, 就不要return true了,直接return false 试试看
mfkwgizhoujian
mfkwgizhoujian
没用。不过我用另一种方式解决了,zTree.addNodes(treeNode, nodes, true);给最后一个参数设置true就可以了。感谢你的回答。
返回顶部
顶部