ztree做的下拉菜单,异步加载回选

发布于 2021-11-29 11:09:01 字数 165 浏览 720 评论 4

@zTree 你好,想跟你请教个问题:ztree做的下拉菜单,异步加载在回选A节点之后再去执行异步展开视窗会跳转到已选中的节点位置

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

皇甫轩 2021-12-04 05:44:53
	/**
     * @title 后台静默加载全部节点,为了选中时能获取到节点
     * @method asyncNodes
     * @param treeObj ztree对象
     * @param nodes 需要强制异步加载children的节点
	 */
	function asyncNodes(treeObj, nodes) {
        
		if (!nodes) {
            return;
		}
		var length = nodes.length;

        for (var i=0; i < length; i++) {
            if (nodes[i].isParent && nodes[i].zAsync) {
                asyncNodes(nodes[i].children);
            } else {
                treeObj.reAsyncChildNodes(nodes[i], "refresh", true);
            }
        }
	}

	/**
	 * @title 异步加载成功后的回调(异步加载默认选中必须在异步加载成功事件实现)
	 * @method _onAsyncSuccess
	 * @param event 异步加载的事件
	 * @param treeId ztree的ID
	 */
	function _onAsyncSuccess(event, treeId, treeNode) {

		// 获取树对象
        var treeObj = getTreeObj(treeId);

    	// 异步加载完成之后默认选中
        defaultSelect(treeObj, treeNode);
	}

	/**
	 * @title 默认选中(根据隐藏域的值默认选中节点)
	 * @method defaultSelect
	 * @param treeId ztree的ID
	 * @param treeNode 当前点击的节点
	 */
	function defaultSelect(treeObj, treeNode) {
		
		// 获取树的参数
		var options = treeObj.setting;
		// 获取当前树绑定的隐藏域对象
		var $hideObj = options.hideObj;
		// 获取是否保持展开闭合状态
		var keepStatus = options.keepStatus;
		// 获取是否是复选树
		var isCheck = options.checkEnable;
		// 如果隐藏域存在且隐藏域有值
		if ($hideObj && $hideObj.val() != '') {
			// 获取 zTree 的全部节点数据(对于异步加载模式下,尚未加载的子节点是无法通过此方法获取的)
            var nodes = treeObj.getNodes();
            // 当treeNode不为null时,需要静默加载当前treeNode的子节点
            if(treeNode != null ){
                nodes = treeNode.children;
            }
            asyncNodes(treeObj, nodes);
            // 如果是复选
            if (isCheck) {
				// 获取隐藏域的值并根据,拆分
				var hidIDArr = $hideObj.val().split(',');
				// 如果拆分后数组长度大于0
				if ($.isArray(hidIDArr) && hidIDArr.length > 0) {
					var length = hidIDArr.length;
					// 初始化已经选中的节点的数量
					var hasCheckedNum = 0;
					// 遍历数组
					for (var i = 0; i < length; i++) {
						// 根据id获取节点对象
						var curNode = treeObj.getNodeByParam("id", hidIDArr[i]) || '';
						// 如果当前节点已加载
						if (curNode != '') {
    						// 勾选该节点对象
    						treeObj.checkNode(curNode, true, true, true);
    						// 勾选不会展开,因此需要手动获取父节点并进行展开操作;
    						recursiveExpendNode(curNode,treeObj);
						}
					}
				}
			}
    		// 如果是单选
            else {
                var curNode = treeObj.getNodeByParam("id", $hideObj.val());
                // 如果当前节点已加载
                if (curNode != '') {
                    // 选中节点
                    treeObj.selectNode(curNode);
                }
            }
		}

		// 如果需要保存展开合并状态
		if (keepStatus) {
			// 获取cookie数组
			var z_tree = getCookieArray();
			// 获取当前页面的actionName
            var actionName = getCurrentActionName();
            
			for (var i = 0; i < z_tree.length; i++) {
				var currentMsgArray = z_tree[i].split('@');
				// 如果actionName和当前页面一致,判断展开
				if (actionName == currentMsgArray[0] && treeId == currentMsgArray[2]) {
					// 根据节点id获取节点对象
					var node = treeObj.getNodeByParam('id', currentMsgArray[1]);
					// 展开节点对象
					treeObj.expandNode(node, true, false, false);
				}
			}
		}
	}

贴上代码,大神帮我看看怎么处理复选框的回选问题,卡了好久了

@zTree

已下线请稍等 2021-12-03 08:32:05

碰到新问题了,这种方法当选可以处理,但是复选时不知道怎么处理了

带上头具痛哭 2021-12-03 06:29:35

可能我的描述不够清晰,异步分级加载节点在初始化树的时候需要根据页面刷新前的选中状态选中节点,但是此时只加载了一级节点,根据隐藏域的ID获取之前的选中节点得到的是null。

有三种解决方案:1、按照demo中全部展开的方法去实现动画效果令人奔溃,而且选中节点的层级较深的话会比一次性加载所有节点还慢,毕竟会重复的去请求后台;

2、判断初始化如果有选中节点ID的隐藏域,则加载全部,因为存在pojo的转换,我们实际数据1500条左右的情况下需要1.5s左右的平均耗时;

3、折中的处理方法,如果有选中节点,初始化时加载到选中节点层级的数据,缺点是如果选中最后一级,也就相当于方案2的速度了;

如果大家有什么好的方法还请不吝赐教!!!

旧伤慢歌 2021-11-30 04:11:39

抱歉,时间有限就不看你的代码了。

提供简单思路如下:

1、在页面加载后,就偷偷的在后台去加载数据,这样也不用担心快慢

2、没必要每次展示时都重新加载数据吧?

3、如果数据不频繁更改,是否可以考虑保存到 localStorage内?

 

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文