`

ExtJS中树形结构级联选中(三态)

阅读更多
在使用ExtJS进行开发时,常常遇到需要用到树形结构Ext.tree.TreePanel,而且经常需要对TreePanel进行级联选中与取消选中,我们的做法无非就是监听checkchange事件进行相应的处理,常用的写法是:
var treePanel = new Ext.tree.TreePanel({
...
listeners : {
'checkchange' : function(){
...
}
}
});

这样做可行吗,答案是肯定的,肯定是可以实现的,只是当你需要多个地方都需要进行级联选中时,你需要拷贝这些代码到需要的地方,这样写代码有些糟糕,复用性太低,也不易于维护,同时,这样写不是很好实现checkbox的三种状态,于是动手写了这样一个插件,实现了树形结构的级联选中与三态,代码如下:
/* 带有CheckBox的树的选中的插件
 * author:jn_nian
 * createTime:2010-10-24 21:46
 * usage: Ext3使用 plugins : ['treecheck']或plugins:[new Ext.ux.TreePanelCheck()]
 * Ext2使用 :plugins:[new Ext.ux.TreePanelCheck()]
*******************************************************************/
 
 Ext.ux.TreePanelCheck = Ext.extend(Ext.tree.TreePanel,{
 	init : function(treePanel){
 		var rootNode = treePanel.getRootNode();
 		
 		treePanel.on('expandnode',this.doLazyCheck,rootNode);
 		treePanel.on('checkchange',this.handlerCheck,this);
 	},
 	
 	
 	//检查子结点选中的情况
 	doChildHasChecked : function(node){
 		var childNodes = node.childNodes;
		var checkedNum = 0;
		if(childNodes || childNodes.length>0){
			for(var i=0;i<childNodes.length;i++){
				if(childNodes[i].getUI().checkbox.checked){
    				checkedNum = checkedNum + 1;
				}
			}
		}
		return checkedNum;
 	},
 	
 	//父节点选中
 	doParentCheck : function(node ,checked){
 		var checkbox = node.getUI().checkbox;
		if(typeof checkbox == 'undefined') return false;
		node.getUI().checkbox.indeterminate = false;
		node.getUI().checkbox.checked = checked;
		
		node.attributes.checked = checked;
		var childChecked = this.doChildHasChecked(node);
		if(childChecked == node.childNodes.length){
			node.getUI().checkbox.checked = true;
			node.getUI().checkbox.indeterminate = false;
		}else if(childChecked == 0){
			var indeterminate = false;
			node.eachChild(function(child){     
	        	if(child.getUI().checkbox.indeterminate){
	        		indeterminate = true;
	        		return false;
	        	}
	        }); 
			node.getUI().checkbox.checked = false;
			node.getUI().checkbox.indeterminate = indeterminate;
		}else{
			node.getUI().checkbox.checked = false;
			node.getUI().checkbox.indeterminate = true; //半选中状态
		}
		
		node.getOwnerTree().fireEvent('check', node, checked);
		var parentNode = node.parentNode;
		if( parentNode !== null){
			this.doParentCheck(parentNode,checked);
		}
 	},
 	
 	handlerCheck : function(node,checked){
 		var parentNode = node.parentNode;
        if(!Ext.isEmpty(parentNode)) {   
        	this.doParentCheck(parentNode,checked);   
        }
        node.attributes.checked = checked;
//		node.expandChildNodes(true);
        node.eachChild(function(child){     
        	child.ui.toggleCheck(checked);    
            child.attributes.checked = checked;     
            child.fireEvent('checkchange', child, checked);
        });
 	},
 	
 	//延迟加载选中
 	doLazyCheck : function(node){
 		if(!Ext.isEmpty(node.parentNode)){
			var nodeChecked = node.getUI().checkbox.checked;
			//node.expandChildNodes(true);
			node.eachChild(function(child){
				child.getUI().checkbox.checked = nodeChecked;
			});
		}
 	},
 	
 	getPType : function(){
 		return this.ptype;
 	}
 });
 Ext.preg('treecheck',Ext.ux.TreePanelCheck);

此代码可以在Ext2.x与3.x下正常运行,当你使用Ext3.x时你不需要对此代码作任何改动,当你使用Ext2.x时,请注释掉最后一行代码:Ext.preg('treecheck',Ext.ux.TreePanelCheck);
最终实现效果图如附件中所示
  • 大小: 27 KB
分享到:
评论
4 楼 soutnila 2014-05-09  
我发现有个问题,比如我从后台加载的数据某一个节点上checked:true,但是在树渲染完成后,该节点未处于选中状态
3 楼 tkl211 2012-06-04  
好的,谢谢。。。 我这两天没上网,晚上我看一下呢。。
2 楼 jn_nian 2012-06-03  
tkl211 写道
我用这个插件出现这个问题。
比如我 三级菜单
10001
    10002
         10003
         10004
(1)我选中 10001的时候,这时候级联选中子节点是没问题,我后台获取id也是这四个,但是当我取消 10003的时候, 这时候取得的checked值 只有 10004 这一个,而10001,10002这时候应该处于半选中状态,应该也能取得值才对的,但是去无法取到值。
(2)我初始化的时候, 10001,10002,10003的checked 是true,10004的为false,这时候,会把我10004这个也默认选中的。

tkl211 写道
我用这个插件出现这个问题。
比如我 三级菜单
10001
    10002
         10003
         10004
(1)我选中 10001的时候,这时候级联选中子节点是没问题,我后台获取id也是这四个,但是当我取消 10003的时候, 这时候取得的checked值 只有 10004 这一个,而10001,10002这时候应该处于半选中状态,应该也能取得值才对的,但是去无法取到值。
(2)我初始化的时候, 10001,10002,10003的checked 是true,10004的为false,这时候,会把我10004这个也默认选中的。

你好,我在做这个插件的时候,认定半选中状态的不算选中的,可能查询Ext源码中getChecked方法的源代码,对其重写即可解决,只需要多加上一个判断,如果有问题,请留言
1 楼 tkl211 2012-05-30  
我用这个插件出现这个问题。
比如我 三级菜单
10001
    10002
         10003
         10004
(1)我选中 10001的时候,这时候级联选中子节点是没问题,我后台获取id也是这四个,但是当我取消 10003的时候, 这时候取得的checked值 只有 10004 这一个,而10001,10002这时候应该处于半选中状态,应该也能取得值才对的,但是去无法取到值。
(2)我初始化的时候, 10001,10002,10003的checked 是true,10004的为false,这时候,会把我10004这个也默认选中的。

相关推荐

    ExtJS4.2 tree 级联选择

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

    ExtJS树形结构.docx

    总的来说,这段代码展示了如何在EXTJS中创建一个具有拖放、动画效果、可折叠和多级节点的树形结构,并且实现了节点选中状态的级联更新。这种树形结构常用于展示具有层次关系的数据,例如组织结构、文件系统或菜单等...

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

    ComboBoxTree将这两者融合,创建了一个下拉树菜单,用户可以在其中浏览和选择树形结构的数据。 要实现单选功能,ComboBoxTree可能使用了Ext.selection.Model类,通过配置singleSelect选项来限制用户只能选择一个...

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

    TreePanel继承自Panel,它利用Ext.tree.TreeNode节点对象来构建树形结构,并提供了丰富的属性和方法供开发者使用,从而实现复杂的功能。 在TreePanel中,TreeNode节点代表树中的一个节点,它的常用属性包括: - ...

    ExtJs_树形机构封装使用说明

    ### ExtJs树形结构封装使用说明 #### 一、概述 在现代Web开发中,树形结构是非常常见的一种数据展示方式,特别是在企业级应用中,用于展现组织结构、文件系统等场景。ExtJs是一个功能强大的JavaScript框架,它提供...

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

    在IT行业中,尤其是在Web开发领域,经常会遇到需要处理复杂数据结构和交互的场景,例如树形数据。ExtJS是一个强大的JavaScript库,它提供了丰富的组件来处理这类问题。本篇文章将聚焦于Ext JS中的一个特定功能——...

    extjs3.X 带复选框的树

    总的来说,带复选框的树在ExtJS 3.x中是一个强大的功能,它结合了树形结构和复选框的选择机制,为用户提供了一种直观且高效的方式来操作层级数据。理解和实现这样的功能,对提升ExtJS应用的用户体验至关重要。

    ExtJs4 Checkbox tree

    ExtJs4 Checkbox Tree是基于ExtJs 4框架实现的一种特殊树形组件,它在传统的树形结构基础上增加了复选框功能。这种组件常用于需要用户多选树形数据的场景,比如权限设置、目录选择等。下面将详细介绍ExtJs4 Checkbox...

    Ext TreePanelrcheckbox级联选择的实现

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

    extjs4带checked的treegrid.rar

    TreeGrid是ExtJS 4中的一个组件,它结合了树形结构和表格的功能,允许用户以表格的形式查看和操作树节点。 在ExtJS 4中,TreeGrid是由TreePanel和GridPanel两种组件融合而成。TreePanel负责展示树形结构,而...

Global site tag (gtag.js) - Google Analytics