Ext.TreeNodeCascade让所有Ext的树支持级联选中

运用了单例模式,使用的话直接让页面文件引用即可。该程序不直接关联任何树的任何事件,可以使用树的checkchange事件对核选的树节点进行进一步操作,譬如修改css样式等;如果通过toggleCheck方法设置结点核选状态将不会进行级联,但会触发树的checkchange事件,压缩包里是一个示例文件

Js代码 复制代码
  1. /**  
  2.  * 给树添加级联选中功能,为树设置属性enableAllCheck则为所有节点添加checkbox;  
  3.  *  
  4.  * 实现方式:  
  5.  * 为TreeNode添加方法:cascadeParent、cascadeChildren;  
  6.  * 修改AsyncTreeNode的loadComplete方法使其加载后自动级联级联子结点(cascadeChildren方法);  
  7.  * 修改TreeEventModel的onCheckboxClick方法是的结点checkbox被点击后级联父节点和子节点;  
  8.  * (注意:之所以不修改TreeNodeUI类是为了使得执行函数为树结点修改选中状态时不进行级联,譬如  
  9.  * 说为所有树节点加载一个选中状态的数组时我们并不希望级联的情况发生);  
  10.  * 为TreePanel添加属性enableAllCheck,  
  11.  * 为TreePanel添加loadCheckedNodes、checkAllNodes方法  
  12.  *  
  13.  * 使用方法:  
  14.  * TreePanel  
  15.  * enableAllCheck:Boolean 此配置项为true时所有加载的结点都会渲染chechbox;  
  16.  * loadCheckedNodes(Array nodes):void 根据结点数组/结点id数组选中结点  
  17.  * checkAllNodes(Bolean checked):void 全选或全不选树中所有节点  
  18.  *   
  19.  * 1.1改动:  
  20.  * 略微修改匿名函数返回值  
  21.  *   
  22.  * @author chemzqm@gmail.com  
  23.  * @version 1.1 (2010-4-24)  
  24.  */       
  25. Ext.TreeNodeCascade = function(){   
  26.     function cascadeParent(){   
  27.         var pn = this.parentNode;   
  28.         if (!pn || !Ext.isBoolean(this.attributes.checked))    
  29.             return;   
  30.         if (this.attributes.checked) {//级联选中   
  31.             pn.getUI().toggleCheck(true);   
  32.         }   
  33.         else {//级联未选中   
  34.             var b = true;   
  35.             Ext.each(pn.childNodes, function(n){   
  36.                 if (n.getUI().isChecked()){    
  37.                     return b = false;   
  38.                 }   
  39.                 return true;   
  40.             });   
  41.             if (b)    
  42.                 pn.getUI().toggleCheck(false);   
  43.         }   
  44.         pn.cascadeParent();   
  45.     }   
  46.        
  47.     function cascadeChildren(){   
  48.         var ch = this.attributes.checked;   
  49.         if (!Ext.isBoolean(ch))    
  50.             return;   
  51.         Ext.each(this.childNodes, function(n){   
  52.                
  53.             n.getUI().toggleCheck(ch);   
  54.             n.cascadeChildren();   
  55.         });   
  56.     }   
  57.        
  58.     /**  
  59.      * 全选或全不选所有结点,必须所有结点都有checked属性  
  60.      * @param {Boolean} checked  
  61.      */  
  62.     function checkAllNodes(checked){   
  63.         this.root.attributes.checked = checked;   
  64.         this.root.cascadeChildren();   
  65.     }   
  66.        
  67.     /**  
  68.      * 根据nodes数组加载选中节点  
  69.      * @param {Object} nodes node或id数组  
  70.      */  
  71.     function loadCheckedNodes(nodes){   
  72.         this.checkAllNodes(false);   
  73.         Ext.each(nodes, function(n){   
  74.             if (Ext.isString(n)) {   
  75.                 n = this.getNodeById(n);   
  76.             }   
  77.             n.getUI().toggleCheck(true);   
  78.         }, this);   
  79.     }   
  80.     /**  
  81.      * tree的属性enableAllCheck为true时,所有节点默认渲染未选中的checkbox  
  82.      */  
  83.     Ext.apply(Ext.tree.TreePanel.prototype, {   
  84.         checkAllNodes: checkAllNodes,   
  85.         loadCheckedNodes: loadCheckedNodes,   
  86.         initComponent: Ext.tree.TreePanel.prototype.initComponent.createInterceptor(function(){   
  87.             if (this.enableAllCheck === true) {   
  88.                 var loader = this.loader;   
  89.                 loader.baseAttrs = loader.baseAttrs || {};   
  90.                 loader.baseAttrs['checked'] = false;   
  91.             }   
  92.         })   
  93.     });   
  94.     /**  
  95.      * 为TreeNode对象添加级联父节点和子节点的方法  
  96.      */  
  97.     Ext.apply(Ext.tree.TreeNode.prototype, {   
  98.         cascadeParent: cascadeParent,   
  99.         cascadeChildren: cascadeChildren   
  100.     });   
  101.     /**  
  102.      * 结点加载后级联子节点  
  103.      */  
  104.     Ext.override(Ext.tree.AsyncTreeNode, {   
  105.         loadComplete: Ext.tree.AsyncTreeNode.prototype.loadComplete.createSequence(function(e, node){   
  106.             this.cascadeChildren();   
  107.         })   
  108.     });   
  109.     /**  
  110.      * Checkbox被点击后级联父节点和子节点  
  111.      */  
  112.     Ext.override(Ext.tree.TreeEventModel, {   
  113.         onCheckboxClick: Ext.tree.TreeEventModel.prototype.onCheckboxClick.createSequence(function(e, node){   
  114.             node.cascadeParent();   
  115.             node.cascadeChildren();   
  116.         })   
  117.     });   
  118. }();  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值