`

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

    博客分类:
  • Ext
阅读更多
运用了单例模式,使用的话直接让页面文件引用即可。该程序不直接关联任何树的任何事件,可以使用树的checkchange事件对核选的树节点进行进一步操作,譬如修改css样式等;如果通过toggleCheck方法设置结点核选状态将不会进行级联,但会触发树的checkchange事件,压缩包里是一个示例文件
/**
 * 给树添加级联选中功能,为树设置属性enableAllCheck则为所有节点添加checkbox;
 *
 * 实现方式:
 * 为TreeNode添加方法:cascadeParent、cascadeChildren;
 * 修改AsyncTreeNode的loadComplete方法使其加载后自动级联级联子结点(cascadeChildren方法);
 * 修改TreeEventModel的onCheckboxClick方法是的结点checkbox被点击后级联父节点和子节点;
 * (注意:之所以不修改TreeNodeUI类是为了使得执行函数为树结点修改选中状态时不进行级联,譬如
 * 说为所有树节点加载一个选中状态的数组时我们并不希望级联的情况发生);
 * 为TreePanel添加属性enableAllCheck,
 * 为TreePanel添加loadCheckedNodes、checkAllNodes方法
 *
 * 使用方法:
 * TreePanel
 * enableAllCheck:Boolean 此配置项为true时所有加载的结点都会渲染chechbox;
 * loadCheckedNodes(Array nodes):void 根据结点数组/结点id数组选中结点
 * checkAllNodes(Bolean checked):void 全选或全不选树中所有节点
 * 
 * 1.1改动:
 * 略微修改匿名函数返回值
 * 
 * @author chemzqm@gmail.com
 * @version 1.1 (2010-4-24)
 */    
Ext.TreeNodeCascade = function(){
    function cascadeParent(){
        var pn = this.parentNode;
        if (!pn || !Ext.isBoolean(this.attributes.checked)) 
            return;
        if (this.attributes.checked) {//级联选中
            pn.getUI().toggleCheck(true);
        }
        else {//级联未选中
            var b = true;
            Ext.each(pn.childNodes, function(n){
                if (n.getUI().isChecked()){ 
                    return b = false;
                }
                return true;
            });
            if (b) 
                pn.getUI().toggleCheck(false);
        }
        pn.cascadeParent();
    }
    
    function cascadeChildren(){
        var ch = this.attributes.checked;
        if (!Ext.isBoolean(ch)) 
            return;
        Ext.each(this.childNodes, function(n){
            
            n.getUI().toggleCheck(ch);
            n.cascadeChildren();
        });
    }
    
    /**
     * 全选或全不选所有结点,必须所有结点都有checked属性
     * @param {Boolean} checked
     */
    function checkAllNodes(checked){
        this.root.attributes.checked = checked;
        this.root.cascadeChildren();
    }
    
    /**
     * 根据nodes数组加载选中节点
     * @param {Object} nodes node或id数组
     */
    function loadCheckedNodes(nodes){
        this.checkAllNodes(false);
        Ext.each(nodes, function(n){
            if (Ext.isString(n)) {
                n = this.getNodeById(n);
            }
            n.getUI().toggleCheck(true);
        }, this);
    }
    /**
     * tree的属性enableAllCheck为true时,所有节点默认渲染未选中的checkbox
     */
    Ext.apply(Ext.tree.TreePanel.prototype, {
        checkAllNodes: checkAllNodes,
        loadCheckedNodes: loadCheckedNodes,
        initComponent: Ext.tree.TreePanel.prototype.initComponent.createInterceptor(function(){
            if (this.enableAllCheck === true) {
                var loader = this.loader;
                loader.baseAttrs = loader.baseAttrs || {};
                loader.baseAttrs['checked'] = false;
            }
        })
    });
    /**
     * 为TreeNode对象添加级联父节点和子节点的方法
     */
    Ext.apply(Ext.tree.TreeNode.prototype, {
        cascadeParent: cascadeParent,
        cascadeChildren: cascadeChildren
    });
    /**
     * 结点加载后级联子节点
     */
    Ext.override(Ext.tree.AsyncTreeNode, {
        loadComplete: Ext.tree.AsyncTreeNode.prototype.loadComplete.createSequence(function(e, node){
            this.cascadeChildren();
        })
    });
    /**
     * Checkbox被点击后级联父节点和子节点
     */
    Ext.override(Ext.tree.TreeEventModel, {
        onCheckboxClick: Ext.tree.TreeEventModel.prototype.onCheckboxClick.createSequence(function(e, node){
            node.cascadeParent();
            node.cascadeChildren();
        })
    });
}();


分享到:
评论
4 楼 kangaroo_xin 2010-07-17  
chemzqm 写道
kangaroo_xin 写道
发现使用loadCheckedNodes(Array nodes)时,没有相应的级联选择。修改了下。


function loadCheckedNodes(nodes){  
       this.checkAllNodes(false);  
       Ext.each(nodes, function(n){  
           if (Ext.isString(n)) {  
               n = this.getNodeById(n);  
           }
           if(n && n.getUI()) {
              n.getUI().toggleCheck(true);
              n.cascadeParent();  
              n.cascadeChildren();
           }  
       }, this);  
} 

这个函数的作用是根据树节点数组设置树上对应节点的选中状态,如果级联的话肯定是不对的,因为会级联到本不该被选中的子节点


那直接点击子节点,和使用loadCheckedNodes check子节点,效果不同呀,一个会选中父节点,一个不会。 除非loadCheckedNodes传入的是把子节点 和 父节点都传入了。
3 楼 zhangdaiping 2010-07-14  
我之前写的一个http://zhangdaiping.iteye.com/admin/blogs/608467
2 楼 chemzqm 2010-07-13  
kangaroo_xin 写道
发现使用loadCheckedNodes(Array nodes)时,没有相应的级联选择。修改了下。


function loadCheckedNodes(nodes){  
       this.checkAllNodes(false);  
       Ext.each(nodes, function(n){  
           if (Ext.isString(n)) {  
               n = this.getNodeById(n);  
           }
           if(n && n.getUI()) {
              n.getUI().toggleCheck(true);
              n.cascadeParent();  
              n.cascadeChildren();
           }  
       }, this);  
} 

这个函数的作用是根据树节点数组设置树上对应节点的选中状态,如果级联的话肯定是不对的,因为会级联到本不该被选中的子节点
1 楼 kangaroo_xin 2010-07-13  
发现使用loadCheckedNodes(Array nodes)时,没有相应的级联选择。修改了下。


function loadCheckedNodes(nodes){  
       this.checkAllNodes(false);  
       Ext.each(nodes, function(n){  
           if (Ext.isString(n)) {  
               n = this.getNodeById(n);  
           }
           if(n && n.getUI()) {
              n.getUI().toggleCheck(true);
              n.cascadeParent();  
              n.cascadeChildren();
           }  
       }, this);  
} 

相关推荐

    Ext TreePanel Checked Ext复选框树

    6. **API调用**:`Ext JS`提供了API接口,如`getChecked()`和`setChecked()`,用于获取所有选中的节点或改变特定节点的选中状态。 7. **数据绑定**:复选框树的数据通常来源于后端服务,通过`Store`进行加载和同步...

    Extjs4.X下comboboxTree下拉树型菜单,完美支持多选、单选,绝对好用

    在ExtJS 4.x框架中,ComboboxTree是一种特殊的组件,它将传统的下拉框与树形结构结合在一起,提供了一种更为灵活的用户输入方式。这种组件在数据选择上非常实用,尤其当数据层级关系复杂时,可以方便地进行多选或...

    Extjs4下拉树菜单ComboBoxTree支持单选和多选并且支持展开选中指定节点的通用控件

    在这个特定的情况下,我们讨论的是一个定制的下拉树菜单控件——ComboBoxTree,它在ExtJS4中实现了单选和多选功能,并且具备展开选中指定节点的能力。这个控件在实际项目中已经被广泛使用并证明了其稳定性和实用性,...

    Ext combo 下拉框级联

    在Web开发中,Ext JS是一个流行的JavaScript框架,它提供了丰富的UI组件,包括级联下拉框(Combobox)。本篇将深入探讨如何在Ext JS中实现级联下拉框的功能。 首先,我们需要了解Ext JS中的Combobox组件。Combobox...

    Ext级联菜单实例

    为了让菜单项之间能够级联,你需要为菜单项添加`click`事件监听器。当用户点击一个菜单项时,这个事件会触发,并且你可以在这个事件处理器中显示相应的子菜单。 4. **显示菜单**: 最后,你需要在适当的位置(例如...

    Ext 树的级联选择扩展插件使用说明

    级联选择(Cascading Selection)则是指当用户选中一个节点时,其所有子节点都会自动被选中,反之,如果取消选中父节点,所有子节点也会随之被取消选中。这种功能在组织结构、文件系统或权限管理等场景下非常有用。 ...

    ext 级联选择的树形控件

    "EXT级联选择的树形控件"是一个实现树形结构并支持级联选择的EXT组件。在实际应用中,它可以帮助用户通过树节点的选择来联动控制其他相关选项的状态。这个控件可能包含以下关键特性: 1. **树形结构**:每个节点...

    Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码

    其中Ext.tree.TreeNode代表一个树节点,比较常用的属性包括text、id、icon、checked等、异步树Ext.tree.AsyncTreeNode、树加载器Ext.tree.TreeLoader。下面介绍Extjs 中的 Treepanel 实现菜单级联选中效果。 在 ...

    Ext TreePanelrcheckbox级联选择的实现

    在实际应用中,我们经常需要处理树形结构的复选框,实现级联选择功能,即当父节点被选中时,其所有子节点自动被选中,反之亦然。这篇博客“Ext TreePanelrcheckbox级联选择的实现”就专注于探讨这个主题。 首先,...

    cas.rar_MATLAB 级联失效_级联_级联失效 代码_级联失效代码_级联失效算法

    在IT领域,级联失效(Cascading Failure)是一种复杂的现象,特别是在网络系统中,如电力网格、互联网或通信网络。当一个组件故障时,它可能导致其他相关组件相继失效,从而引发大规模的系统崩溃。MATLAB作为一种...

    纯JS+HTML写的checkBox Tree 级联选中 好用无BUG

    在前端开发中,CheckBox Tree(复选框树)是一种常见的组件,用于展示具有层级关系的数据,并支持用户进行多级选择。这个"纯JS+HTML写的checkBox Tree 级联选中"实例,解决了其他示例中可能存在的BUG,提供了一个...

    ExtJs4.1.1a 异步树&级联选择

    说明:本例主要实现在树节点数据过多的情况下对数据进行异步请求,并且在请求数据返回前台的同时实现级联选择。使用ExtJs版本为4.1.1a,在struts2下测试通过。例子仅供提供思路,简单易懂,不负责代码优化,哈哈!

    Ext 开发指南 学习资料

    如何让grid总所有的列都支持排序 A.9.2. 修改一个grid的ColumnModel和Store A.9.3. 动态为ds添加参数baseParams A.10. 有关tree的一些小问题 A.10.1. 如何选中树中的某个节点 A.10.2. 刷新树的所有节点 A.10.3. ...

    ExtJS4.2 tree 级联选择

    在ExtJS库中,Tree组件允许我们展示和操作数据以树形结构显示,而级联选择功能则意味着当用户选择一个节点时,它的所有子节点也会被自动选中,反之亦然,如果取消选中父节点,其所有子节点也将被取消选中。...

    checktreepanel node级联选中,支持半选

    "级联选中"(Cascading Selection)是指当一个节点被选中或取消选中时,它的所有子节点都会自动地随之被选中或取消选中。这种行为在处理层次结构数据时非常有用,因为它使得用户可以便捷地选择或排除一整组相关的...

    extJs ComboBox级联

    ExtJS ComboBox级联是一种在Web应用中常见的交互方式,它允许用户从下拉列表中选择一个值,并且这个选择会影响到另一个ComboBox的选择项,通常用于表示层级关系的数据,比如省份-城市-区县。这种功能在数据筛选、...

    EXT2.0中文教程

    让你知道ext表格控件的厉害。 2.1. 功能丰富,无人能出其右 2.2. 让我们搞一个grid出来耍耍吧。 2.3. 上边那个是1.x的,2.0稍微有些不同哦 2.4. 按顺序,咱们先要把常见功能讲到 2.4.1. 自主决定每列的宽度 2.4.2. ...

Global site tag (gtag.js) - Google Analytics