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

 我来答
夜独行孤单
2016-03-14 · TA获得超过3460个赞
知道大有可为答主
回答量:2803
采纳率:82%
帮助的人:636万
展开全部
最近在项目中遇到一个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);
这样递归的展开所有的子节点,但是还是不能具体的返回标志说已经展开完毕所有节点,我想利用这个标志判断是否已经加载完毕,能否说的更详细点。问题补充:clue 写道给你扩展的deepExpand不是有个回调参数吗?如果全部展开完毕就会调用这个回调
换句话说,回调被调用时,该节点的所有子节点一定被全部展开完成
不好意思大拿,问下,您的这个this.childNodes只是父节点下的直接子节点,如果子节点下还有子节点这种多层嵌套节点的情况,这种回调传参就不能确定到最底层的节点是否有被展开,而只能确定父节点的直接子节点有被全部展开或每展开一层节点完毕就调用了这个回调。
,for循环中调用的是自身:deepExpand
刚才把这段代码放到Ext.onReady的开始,然后在后面用一个父节点subRoot.deepExpand(false,function(){alert('expanded all!');},this); ,但是当节点被正常全部展开之后,没有打印'expanded all!'问题补充:clue 写道可能是没考虑叶子节点的情况
加上一句吧:
if(len<=0){
taskDone();return;}// 递归展开
for(var i = 0, len = cs.length; i < len; i++) {
cs[i].deepExpand(anim, taskDone, this);}
刚才用FireBug调试后发现:这段代码是将父节点的子节点一层展开完后,再去展开子节点的子节点,这样当一层展开完之后便会去调用那个回调,这样会造成每展开完一层就要回调这个callback,没有达到所有节点展开完毕再回调的效果,并且firebug还报this.runCallback(callback,scope || this,[this])中的callback未定义,但是我用传了一个用是这样写的: subRoot.deepExpand(false,function(){
if(len<=0){
taskDone(); // <--- 这里? 应该修改为 taskDone.call(this);return;}// 递归展开
for(var i = 0, len = cs.length; i < len; i++) {
逻辑是没问题,每展开一个子节点,都会调用taskDone回调。taskDone中有判断当前完成了多少个节点,如果根据计数判断都完成的就调用最终回调。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式