`
zTreeAPI
  • 浏览: 345149 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

zTree v2.x 升级 v3.0 之 异步加载 与 添加节点的错误分析

阅读更多

      (补充: 计划 v3.1 中修改进行异步加载的逻辑: 父节点默认状态下只能异步加载一次,除非 使用 reAsyncChildNodes 方法强行进行异步加载。这样也就不会出现这个要讨论的错误了。)

    zTree v3.0 对于可编辑模式 和 异步加载模式共存的处理做了一些完善,从而也会导致使用原先 v2.x 实现的方法放在 v3.0 下出现异常。

 

    这里针对 onAsyncSuccess 回调函数中 使用  addNodes 添加节点 的问题做一个详细说明。

 

    错误现象(此问题由:overlord 朋友提供):

 

    利用Demo中的 async.html 做测试,让 setting 中增加 onAsyncSuccess 的配置,代码如下:

 

 

onAsyncSuccess:function(event, treeId, treeNode, msg){//如果没有加载到子结点就会执行多次
	console.log("onAsyncSuccess...");
	var da = $.fn.zTree.getZTreeObj("treeDemo").addNodes(treeNode,{name:'你好',isParent:true}, true);
}

 

    A、如果异步加载的地址只能输出 [],表明是空结果,这样会发现根节点显示正常,只有一个“你好”的节点,但如果点击展开“你好”节点后,会发现会自动添加 3 个“你好”的子节点。 

 

    B、如果异步加载能过输出正常节点数据,那么不会出现此问题,每次异步加载后都只添加 1 个 "你好" 的子节点。

 

    为何如此使用? 

 

    我个人推断,是因为 v2.x 中添加子节点时,父节点不会自动异步加载已有的子节点,所以利用expandNode方法让父节点展开,同时捕获 asyncSuccess 方法确认加载完毕 并 添加新的子节点。

 

    (v3.0 中完全不需要这么操作,只需要直接使用 addNodes 方法,zTree 会自动先去异步加载已有的子节点,然后再添加新的子节点。)

 

    因此,我要说对于 v3.0 来说,要尽量避免在 onAsyncSuccess 回调中使用  addNodes、reAsyncChildNodes 这两个方法,因为如果使用不当有可能会造成事务流程的多次循环。

 

    如果你有兴趣做深入了解,请先看看 v2.x 和 v3.0 中针对 addNodes 和 expandNode 两个操作的事务流程图

 

 

当你理解的上面的流程图以后,再看看针对这个错误制作的事务流程图,就会明白为何会产生3个节点了。(其中每种颜色代表了一次线程的操作过程)

 

 

这里特别感谢  overlord  和 czwlucky 两位朋友的大力协助。 同时也希望大家能一起讨论这个问题。

分享到:
评论
8 楼 zTreeAPI 2012-08-14  
lixiang21 写道
大哥 我正在使用您写的树 遇到点问题 我加载的时候要 点击后去寻找 然后加载子节点 能不能加载完第一级节点之后 自动加载子节点啊? 这样用户就不需要等待了!!谢谢!!

参考这个 Demo 吧: http://www.ztree.me/v3/demo.php#_512
7 楼 lixiang21 2012-08-13  
大哥 我正在使用您写的树 遇到点问题 我加载的时候要 点击后去寻找 然后加载子节点 能不能加载完第一级节点之后 自动加载子节点啊? 这样用户就不需要等待了!!谢谢!!
6 楼 zTreeAPI 2012-01-19  
renjie120 写道
....

呵呵,大家互相学习嘛。 如果你当初的 gridTree 也直接做成开源,并且坚持下来的话,不一定会比 zTree 差的哟! zTree 能做到现在这样绝对是开源的力量!
5 楼 renjie120 2012-01-18  
zTreeAPI 写道
renjie120 写道
使用zTree感觉很棒,以后会一直使用你的树,谢谢你的奉献

问一个小问题,就是得到treeNode.tId的时候,为什么不是json串里面的id属性?而是自动生成的"treeid+数字"的串.

要配置属性么?我配置了simpleData.idKey属性,也没有效果,点击tree节点的时候,弹出id仍然不是我后台的id.



很高兴你能喜欢 zTree。

tId 是zTree 内部的节点唯一标识,用于保证节点绝对的唯一! 节点数据的 id 属性对于 zTree 来说不是必须的,只有使用简单数据模式才有作用。

另外 因为 我无法对用户数据中的 id 进行控制,所以不排除会出现相同 id 的情况;因此 tId 就成了节点绝对的唯一标识,而且 DOM 也是使用 tId 当做id。 如果你需要获取你的id,那么只需要从节点数据 treeNode 中得到 id 属性即可,例如: treeNode.id

在 zTree 的各个接口或回调函数中基本上都会把 treeNode 传过来,便于用户使用。 另外 getNodeByTId  getNodeByParam  getNodesByParam getNodesByParamFuzzy 几个方法也可以帮你快速查找满足你需求的节点数据。

ok,谢谢你.没有想到你回复这么快.
我也写过一个jquery插件,表格树GridTree,没有你的好.呵呵 向你学习.
4 楼 zTreeAPI 2012-01-18  
renjie120 写道
使用zTree感觉很棒,以后会一直使用你的树,谢谢你的奉献

问一个小问题,就是得到treeNode.tId的时候,为什么不是json串里面的id属性?而是自动生成的"treeid+数字"的串.

要配置属性么?我配置了simpleData.idKey属性,也没有效果,点击tree节点的时候,弹出id仍然不是我后台的id.



很高兴你能喜欢 zTree。

tId 是zTree 内部的节点唯一标识,用于保证节点绝对的唯一! 节点数据的 id 属性对于 zTree 来说不是必须的,只有使用简单数据模式才有作用。

另外 因为 我无法对用户数据中的 id 进行控制,所以不排除会出现相同 id 的情况;因此 tId 就成了节点绝对的唯一标识,而且 DOM 也是使用 tId 当做id。 如果你需要获取你的id,那么只需要从节点数据 treeNode 中得到 id 属性即可,例如: treeNode.id

在 zTree 的各个接口或回调函数中基本上都会把 treeNode 传过来,便于用户使用。 另外 getNodeByTId  getNodeByParam  getNodesByParam getNodesByParamFuzzy 几个方法也可以帮你快速查找满足你需求的节点数据。
3 楼 renjie120 2012-01-18  
使用zTree感觉很棒,以后会一直使用你的树,谢谢你的奉献

问一个小问题,就是得到treeNode.tId的时候,为什么不是json串里面的id属性?而是自动生成的"treeid+数字"的串.

要配置属性么?我配置了simpleData.idKey属性,也没有效果,点击tree节点的时候,弹出id仍然不是我后台的id.

2 楼 zTreeAPI 2012-01-18  
leocaan 写道
您好,ztree非常强大,是我所见过的最好的tree,有些个人建议,敬请斟酌:
1、能否修改或封装成widget插件模型,使用和学习更方便,也易于其他人进行插件集成;
2、能否像jstree一样内部用插件模型,因为ztree太强大,却不是每个功能都需要在特定环境应用的,内部再用功能插件来扩展或重载,各插件还可以在不同文件中,减少不必要的加载;
                                                  leocaan@qq.com
                                           陈栋

非常感谢你的建议!

1、目前 v3.0 已经是为了这个目的 在 v2.6 的基础上进行了一定拆分,但肯定还没有到达你理想中那种如此细微功能的拆分。但现在 v3.0 的架构在一定程度上应该也是可以随意编写zTree 的扩展功能,这方面可以模仿 excheck 和 exedit 两个 js 的编写方式。 但很抱歉,由于时间关系,我还无法专门制作高级使用包括编写扩展功能包的各种说明。

2、对于是否能封装成简单的 widget 插件模型,还有待商榷。毕竟 zTree 不是一个简单的 UI 小插件,只需要和 某个 DOM 集成起来就快速实现全部功能。

3、我在制作 zTree 时,没有使用通常的方案直接用 DOM 当做主体进行功能扩展,而是以数据为中心,树的业务逻辑为主干,DOM 主要就是为了界面显示和操作。 另外,既然要做 开源插件,也是希望能尽可能满足各种千奇百怪的需求,所以 我在制作 zTree 时也更希望 zTree 能够成为一种 树的框架核心,zTree 提供各种功能的接口,用户可以随意在 zTree 的基础上进行扩展和使用。

总之感谢你的肺腑之言,你的建议我也会认真考虑,希望今后的 zTree 或者 再制作新的插件时能够尽可能让大家使用、学习、扩展都很方便。
1 楼 leocaan 2012-01-18  
您好,ztree非常强大,是我所见过的最好的tree,有些个人建议,敬请斟酌:
1、能否修改或封装成widget插件模型,使用和学习更方便,也易于其他人进行插件集成;
2、能否像jstree一样内部用插件模型,因为ztree太强大,却不是每个功能都需要在特定环境应用的,内部再用功能插件来扩展或重载,各插件还可以在不同文件中,减少不必要的加载;
                                                  leocaan@qq.com
                                           陈栋

相关推荐

    jquery.zTree.js.rar

    jquery-1.4.4.min.js jquery.ztree.exhide.min.js jquery.ztree.exedit.min.js jquery.ztree.excheck.min.js jquery.ztree.core.min.js jquery.ztree.all.min.js jquery-1.4.4.js jquery.ztree.exhide.js jquery....

    ZTree v3.x (JQuery Tree插件)

    4. **节点操作**:ZTree提供了丰富的API接口,用于对树进行操作,如添加节点(`treeObj.addNodes()`)、删除节点(`treeObj.removeNode()`)、选择节点(`treeObj.selectNode()`)、展开/折叠节点(`treeObj....

    ZTree v3.x (JQuery Tree插件) (API+Demo)

    6. **API接口**:提供了一系列的API接口,用于在运行时动态操作树,如zTree.init()初始化树,zTree.expandNode()展开节点,zTree.selectNode()选择节点等。 7. **CSS样式自定义**:支持自定义样式,可以通过修改或...

    zTree3.x.rar

    zTree3.x.rar zTree3.x.rar zTree3.x.rar zTree3.x.rar zTree3.x.rar zTree3.x.rar zTree3.x.rar zTree3.x.rar

    zTreeStyle.css

    .ztree li span.button.chk.checkbox_false_full { background-position: -5px -5px; } .ztree li span.button.chk.checkbox_false_full_focus { background-position: -5px -26px; } .ztree li span.button.chk...

    jquery.ztree.exhide.js

    ztree实现模糊查询需要的依赖包:jquery.ztree.exhide.js

    jQuery zTree 3.5.22

    1. **异步加载**:zTree支持懒加载机制,可以按需加载子节点数据,减少初次加载时的数据量,提高页面响应速度。 2. **复选/单选**:zTree提供了复选框和单选按钮功能,允许用户多选或单选节点,同时支持全选、反选...

    zTree v3.5.37 API 文档

    9. **createNode**: 创建新的节点,适用于动态添加节点。 10. **updateNode**: 更新已存在的节点,包括文本、图标等信息。 以上仅为 zTree API 的部分关键点,实际应用中可能涉及更多细节和高级功能,如拖放排序、...

    zTree异步加载子节点针对大数据量数列表

    最近项目中有一个比较大型的树节点加载,网上面也看过一些解决方案,感觉都不是很好,也有很多误区,比如单击节点时加载子...ztree fileter方法是在每次展开时都会执行,所以根据不同的请求达到异步加载子节点的需求。

    java实现ztree异步加载

    ZTree的一个显著特性是支持异步加载,这意味着它可以在用户需要时按需加载子节点,减少了初次加载时的数据量,提高了页面响应速度。本文将详细讲解如何使用Java来实现ZTree的异步加载功能。 首先,我们需要理解...

    jquery ztree 异步动态加载

    ZTree通过异步加载策略,只在用户展开某个父节点时请求服务器获取该节点的子节点数据,这样可以显著减少网络传输的负担。 **3. 实现异步加载** 在ZTree中,实现异步加载需要配置相应的参数。主要涉及以下几个关键...

    JQuery zTree v3.0 下载

    它与 IE、FireFox、Chrome 等浏览器保持兼容,在一个页面内可同时生成多个Tree 实例,支持一次性静态生成和Ajax 异步加载两种方式,能够响应和反馈多种事件。它提供了个性化的定制服务,支持灵活的参数配置,用户...

    jQuery zTree 异步加载添加子节点重复问题

    要解决异步加载添加子节点时的重复问题,关键在于正确地处理与父节点的交互逻辑。在zTree中,当用户通过某种交互方式请求添加一个子节点时(例如通过点击添加按钮),我们需要确保该节点的添加是基于当前的父节点...

    jquery.ztree

    ztree demo jquery.ztree,jquery.ztree.core.js,jquery.ztree.core-3.5.min.js,jquery.ztree.excheck-3.5.min.js,jquery.ztree.all.min.js,jquery.ztree.exedit.js,jquery.ztree.exhide.min.js,jquery-1.4.4.min...

    jquery.ztree.all.js

    用于生成树形组件,javaScript的一个插件,用于使用树形的下拉组件!

    异步&同步加载树节点----zTree(一)

    在IT领域,尤其是在前端开发中,构建用户友好的...理解并掌握异步加载的原理和配置,对于优化zTree的使用至关重要,也是前端开发中的重要技能之一。通过实践和不断探索,开发者可以更好地利用zTree来满足各种项目需求。

    bootstrap-ztree3.zip

    它还支持异步加载数据,这意味着树节点可以在需要时动态加载,提高页面加载速度。此外,ZTree提供了丰富的事件回调和API接口,允许开发者自定义节点的点击行为、拖拽操作、右键菜单等功能,以满足各种业务需求。 在...

    zTree异步加载简单示例VS2008项目完整源码

    异步加载(Async Loading)是zTree的核心特性之一,它能够显著提高用户体验,特别是在处理大量数据时。当用户展开节点时,zTree仅会请求并加载当前需要的数据,而不是一次性加载所有数据,这大大减少了页面加载时间...

    jquery.ztree.core.js

    是一个js文件,zTree实现权限分配所需,可去ztree官网自行下载

Global site tag (gtag.js) - Google Analytics