怎样判断ExtJS 异步tree的某个节点下的所有节点都已经加载了

问题描述

最近在项目中遇到一个Ext 异步树头痛的问题:树中的每个节点都有一个checkbox,当勾选父节点时,也需要将其所有的子节点都选中,但是问题是当前还没有加载这些子节点。知道可以通过对父节点加tree.on(checkedchange,function(node){node.expand(..递归.)});的形式逐个展开所有的子节点,但是怎样才能知道父节点下的所有子节点都被展开选中了呢? 因为要在这之后对该父节点和其所有子节点做一些操作。 tree.on('checkedchange',function(node,checked){ node.attributes.checked = checked; node.expand(true,true,function(){ node.eachChild(function(child){ child.getUI.checked = checked; child.attributes.checked = checked; child.toggle(); child.fireEvent('checkedchange',child,checked,tree); }); node.collapse(); }); },tree);这个操作可能是在用户选中了父节点的情况下马上就执行(从选中父节点到执行操作的时间很短,其所有子节点根本都还没有完全展开),这样就有可能会丢失一些还没有来得及展开完的子节点,所以需要一个判断所有节点都被异步加载完的事件......(父节点下所有子节点的节点个数先前是未知的)....希望大家各抒己见,帮帮解决下,谢谢!!本人才30分的积分,给出5分吧。 问题补充:谢谢牛人的回答。。这样递归的展开所有的子节点,但是还是不能具体的返回标志说已经展开完毕所有节点,我想利用这个标志判断是否已经加载完毕,能否说的更详细点。

解决方案

……我主要给你的是思路,程序什么的都是随手敲的,未经验证所以经常有些小错误,出错的地方是这里么?if(len<=0){taskDone(); // <--- 这里? 应该修改为 taskDone.call(this);return;}// 递归展开for(var i = 0, len = cs.length; i < len; i++) {cs[i].deepExpand(anim, taskDone, this);}逻辑是没问题,每展开一个子节点,都会调用taskDone回调。taskDone中有判断当前完成了多少个节点,如果根据计数判断都完成的就调用最终回调。
解决方案二:
可能是没考虑叶子节点的情况加上一句吧:if(len<=0){taskDone();return;}// 递归展开for(var i = 0, len = cs.length; i < len; i++) {cs[i].deepExpand(anim, taskDone, this);}
解决方案三:
你试试就知道了,这里是个递归调用,for循环中调用的是自身:deepExpand
解决方案四:
给你扩展的deepExpand不是有个回调参数吗?如果全部展开完毕就会调用这个回调换句话说,回调被调用时,该节点的所有子节点一定被全部展开完成
解决方案五:
哦。。。以上代码有个小错误,第4行调用expand首参数应该是false:this.expand(false, anim, function(){
解决方案六:
扩展一下树节点,增加一个deepExpand接口Ext.override(Ext.tree.TreeNode, {deepExpand : function(anim, callback, scope){// 先展开本节点this.expand(true, anim, function(){// 然后展开子节点var cs = this.childNodes, expanded = 0,len = cs.length,taskDone = function(){// 每展开成功一个子节点,计数+1expanded++;// 如果所有子节点都展开,调用最终回调if(expanded >= len){this.runCallback(callback, scope || this, [this]);}};// 递归展开for(var i = 0, len = cs.length; i < len; i++) {cs[i].deepExpand(anim, taskDone, this);}}, this);}});

时间: 2024-10-26 05:43:24

怎样判断ExtJS 异步tree的某个节点下的所有节点都已经加载了的相关文章

利用java算法排列组合父节点下的子节点

问题描述 利用java算法排列组合父节点下的子节点 一个item下有多个父节点,一个父节点下面有多个子节点,通过遍历父节点把每个父节点的子节点遍历出来,然后对子节点进行组合,求大神帮我补全代码 List parents = mrItemDimCombMybatisDao.getAllParentByItem(itemId); for (MrItemDim parent : parents) { List sons = mrItemDimCombMybatisDao.getAllSonByPare

TreeView 递归 去 一个节点下 所有 叶子节点的问题,在线等待高人帮忙,急~!

问题描述 我把没用的代码都去掉,核心代码就是下面的,点击树上的某个控件之后,用递归把其下面的所有叶节点全部取出来,但是出了错,在线等待高人解答错在哪里,或者直接告诉我应该怎么取//点击树上的某个节点protectedvoidtvCate_SelectedNodeChanged(objectsender,EventArgse){//利用递归获取他所有的子节点tn=tvCate.getSelectedNode();TreeNodetn2=newTreeNode();getLeafNode(tn,tn

C# xml节点下的子节点上下移动

问题描述 我在后台将xml拼成了tr然后返回到前台给一个table现在要做tr上下移动效果我就要在后台写移动xml节点的子节点我只有一个节点移他下面的子节点 解决方案

递归删除一个节点以及该节点下的所有节点示例

 一段递归删除一个部门以及它的所有子部门的一段代码.仅供大家参考和自己以后备用 有的时候删除信息的时候,需要把这条信息下的所有的都删除,这个时候就需要递归删除了.下面是我在做部门管理中的删除部门功能的时候写的一段递归删除一个部门以及它的所有子部门的一段代码.仅供大家参考和自己以后备用.    下面是我的一段代码的展示:   代码如下: /*  * 修改一条部门信息  */  function del($bumen_id){  $sql="select bumen_id from lxsm_bum

JSP中使用EasyUI实现异步加载tree(整合Struts 2)

首先jsp页面有一ul用于展现Tree <ul id="mytree"></ul> 加载Tree <script type="text/javascript"> $('#mytree').tree({ url:'treeLoad.action' }); </script> 配置Action <struts> <package name="tree_json" extends=&qu

关于 jQuery Easyui异步加载tree的问题解析_jquery

想要实现从本地中加载json文件,通过事件来动态的插入到ul中时,遇到了一小bug html中代码是这样的 <ul class="easyui-tree" id="tt"></ul> js中的代码 $(".next-menu:nth-child(1) a").click(function() { var $IDstr = $(this).attr("id"), $treeIDNum = parseInt

ExtJS入门教程05,grid的异步加载数据

上一篇演示了extjs grid的基本用法,并加载了本地数据.今天我们将演示如何加载异步数据. 所谓异步,就是通过ajax的方式将服务器端的数据加载到我们的grid中.为了提供数据,我们先定义一个数据类,并创建一些临时数据. public class UserEntity { public string ID { get; set; } public string Name { get; set; } public int Age { get; set; } public static List

关于extjs中TabPanel加载grid问题?急!急!!!!! 在线等

问题描述 Ext.onReady(function(){Ext.QuickTips.init();//浮动信息提示Ext.BLANK_IMAGE_URL='../../../js/extjs/resources/images/default/s.gif';//替换图片文件地址为本地//alert(Ext.BLANK_IMAGE_URL);//创建一个简写varTree=Ext.tree;//定义根节点的Loadervartreeloader=newTree.TreeLoader({//dataU

无线性能优化:页面可见时间与异步加载

如何让页面尽可能早地渲染页面,页面更早可见,让白屏时间更短,尤其是无线环境下,一直是性能优化的话题. 页面可见时间 页面可见要经历以下过程: 解析 HTML 为 DOM,解析 CSS 为 CSSOM(CSS Object Model) 将 DOM 和 CSSOM 合成一棵渲染树(render tree) 完成渲染树的布局(layout) 将渲染树绘制到屏幕 layout 由于 JS 可能随时会改变 DOM 和 CSSOM,当页面中有大量的 JS 想立刻执行时,浏览器下载并执行,直到完成 CSSO