z-tree 的reAsyncChildNodes 方法的入参值(parentNode)应该是什么?为什么一直不行?

一碗粉条 发布于 2012/02/23 14:24
阅读 6K+
收藏 0

我打算用reAsyncChildNodes异步刷新某个节点,可是一直不行,就算可以的话,这个节点也会失去选中,再次刷新就不行了.现在比如我要刷新A节点,我要怎么做呢?希望前辈帮帮忙。。。

以下是问题补充:

@一碗粉条:这是demo中的方法 var treeObj = $.fn.zTree.getZTreeObj("tree1"); var nodes = treeObj.getSelectedNodes(); if(nodes.length!=0){ for (var i=0, l=nodes.length; i<l; i++) { treeObj.reAsyncChildNodes(nodes[i], "refresh", isSilent); treeObj.selectNode(nodes[i]); } } 为什么一刷新我的就失去选中了,而demo中不会。。。 (2012/02/23 15:12)
@一碗粉条:突然想到,问题可以简单就,就是,怎么刷新一个节点或者reAsyncChildNodes方法的使用,前辈们,帮帮忙呀。。。z-tree出来很久啦。。。应该有人知道的。。。 (2012/02/23 16:41)
加载中
0
zTree
zTree

引用来自“孤影飞翔”的答案

如图:现在操作是这样的选择了"第一"这个节点,点击"新增子组',新增一个子节点后,入库完毕,调用reAsyncChildNodes方法刷新"第一"这个节点,都是正常的,不过刷新之后,第一这个节点就失去了选中,再次新增节点就没办法刷新了,利用selectNode方法也不行。。。

1、单纯看你的描述真看不出来和Demo能有多大的区别,也就是多了一个ajax调用后台而已。 所以关键还是要看你的代码是如何实现的了。

2、reAsyncChildNodes 方法中第一个参数是需要异步加载子节点的父节点的数据,这个要保证此数据是 zTree 内部使用的节点数据,不知道你的操作是否有误。

3、你这失去节点后,都无法使用 selectNode 方法,让我感到很可能是你的节点数据出现了问题,可能是不知道什么时候你的节点数据被替换了;尤其你刷新后父节点就会失去焦点,让我感觉你是在对整棵树进行刷新。

一碗粉条
一碗粉条
前两天都弄其他的,今天才去认真看下程序,原先这个是另外一个同事加的,认真看了下,原来在他在onAsyncSuccess 中调用了selectNode方法(不知道为什么要调用),导致数据出错,就出现了我提出的问题,今天终于解决
0
一碗粉条
一碗粉条

自己顶下。。。

0
一号男嘉宾
一号男嘉宾
异步刷新加点,我是这样做的,在callback事件的onclick事件写了一个方法,点击节点的时候就传当前节点的ID到servLet,servLet用当前的ID做父节点查询数据库,返回就可以了。
一碗粉条
一碗粉条
异步加载数据现在是可以的,现在在做节点的增,删等操作的时候,也需要异步的刷新,demo中有用到reAsyncChildNodes 具体使用的时候一直不行。。。
0
一碗粉条
一碗粉条

好吧。。我再顶下应该没事吧。。。

0
zTree
zTree

1、如果你只想异步刷新某一个节点的信息,那么 zTree 没有这种功能,你只能是自己利用 ajax 获取该节点的最新信息,然后直接修改这个节点的各个属性,如果牵扯到name这种用于显示的属性,那么请用 updateNode 方法进行更新

2、如果你是刷新某个父节点的子节点,这时候使用 reAsyncChildNodes 方法是有效地,可以重新加载其全部子节点。

3、【重点】请务必搞清楚异步加载的原理。如果你想针对异步加载结束后做操作,绝对不能直接在 reAsyncChildNodes 语句执行后立刻执行你的代码,因为这时候异步加载可能刚刚开始,根本尚未执行完毕。 对于异步加载一定要利用 onAsyncSuccess 和 onAsyncError 这两个回调函数来捕获异步加载完毕的事件。所以要在确认异步加载完毕之后再进行选中操作。

4、【重点】zTree 是以节点数据为核心,所以重新异步加载子节点的时候请务必记住,刷新后的子节点数据对象已经和原先的数据对象不同了。 如果你在刷新之前得到的子节点数据对象,绝对不能在 重新异步加载之后 直接拿来操作,因为该数据在 zTree 内已经不存在了。这种情况你需要利用从父节点获取子节点的方法,或者利用 getNodesByParam等方法查找你需要找到的节点数据,然后才能使用 selectNode 方法进行处理。

不知道说的是否能明白,也有可能没能完全理解你的意图,如果有问题就继续沟通吧。

一碗粉条
一碗粉条
如图:现在操作是这样的选择了"第一"这个节点,点击"新增子组',新增一个子节点后,入库完毕,调用reAsyncChildNodes方法刷新"第一"这个节点,都是正常的,不过刷新之后,第一这个节点就失去了选中,再次新增节点就没办法刷新了,利用selectNode方法也不行。。。不知道我是不是思路有错误、、
0
一碗粉条
一碗粉条

如图:现在操作是这样的选择了"第一"这个节点,点击"新增子组',新增一个子节点后,入库完毕,调用reAsyncChildNodes方法刷新"第一"这个节点,都是正常的,不过刷新之后,第一这个节点就失去了选中,再次新增节点就没办法刷新了,利用selectNode方法也不行。。。

0
一碗粉条
一碗粉条

引用来自“zTree”的答案

引用来自“孤影飞翔”的答案

如图:现在操作是这样的选择了"第一"这个节点,点击"新增子组',新增一个子节点后,入库完毕,调用reAsyncChildNodes方法刷新"第一"这个节点,都是正常的,不过刷新之后,第一这个节点就失去了选中,再次新增节点就没办法刷新了,利用selectNode方法也不行。。。

1、单纯看你的描述真看不出来和Demo能有多大的区别,也就是多了一个ajax调用后台而已。 所以关键还是要看你的代码是如何实现的了。

2、reAsyncChildNodes 方法中第一个参数是需要异步加载子节点的父节点的数据,这个要保证此数据是 zTree 内部使用的节点数据,不知道你的操作是否有误。

3、你这失去节点后,都无法使用 selectNode 方法,让我感到很可能是你的节点数据出现了问题,可能是不知道什么时候你的节点数据被替换了;尤其你刷新后父节点就会失去焦点,让我感觉你是在对整棵树进行刷新。

前辈。。我不是刷新全部的,你可以看到我代码,和demo其实是没有区别的,只是多加一个ajax操作,不知道哪里出问题了

0
zTree
zTree

1、请你学会自己查找问题,要找到关键点。一个是要逐步调试,另一个是要化繁为简,逐步取消多余的功能,看看是哪个地方影响的逻辑错误

2、你这给出来的代码,和 Demo 几乎一模一样,一点意义都没有,因为Demo并没有这个错误,出现不同的结果肯定是在有差异的地方出现的,不能只去看那些相同的地方。

3、你给的这个代码还有点儿问题 for 循环里面居然用的都是 nodes[0] 但这不应该是导致你这个错误的原因。 

如果你实在找不到问题,就把你的例子做成 html 的demo 在这里贴出来 或者 发给我看看吧。

zTree
zTree
5. 异步加载有一个标准的 callback 就是 onAsyncSuccess 和 onAsyncError 不知道还有什么问题惹得你这么tmd 不爽了?
zTree
zTree
3. 我从来没说 zTree 结构好,我也在考虑完全重新设计结构,因为当初只是学习 jQuery的时候就做了一个树而已,现在想全面改版只是苦于工作比较繁忙,业余时间太少无暇顾及。4. refresh 本来就是tmd 满足某些极端需求的,我在 api 中都说了不建议使用的。
zTree
zTree
回复 @tobysd04 : 1. 问题不清楚如何给出实际答案?2.没有给出实际答案但是人家就是根据我说的问题找到了原因并且解决了问题,不知道有何不厚道?
t
tobysd04
你说人家妥妥的,没有给出实际的答案,不厚道。 个人感觉ztree封装还是有缺陷,reAsynChildNodes方法是异步请求的,如果节点没有刷新完毕, 在数据没有返回之前执行任何操作都是不行的,给个“refresh”太tmd土了,为什么不给个callback呢?
返回顶部
顶部