在使用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
分享到:
相关推荐
在ExtJS库中,Tree组件允许我们展示和操作数据以树形结构显示,而级联选择功能则意味着当用户选择一个节点时,它的所有子节点也会被自动选中,反之亦然,如果取消选中父节点,其所有子节点也将被取消选中。...
总的来说,这段代码展示了如何在EXTJS中创建一个具有拖放、动画效果、可折叠和多级节点的树形结构,并且实现了节点选中状态的级联更新。这种树形结构常用于展示具有层次关系的数据,例如组织结构、文件系统或菜单等...
ComboBoxTree将这两者融合,创建了一个下拉树菜单,用户可以在其中浏览和选择树形结构的数据。 要实现单选功能,ComboBoxTree可能使用了Ext.selection.Model类,通过配置singleSelect选项来限制用户只能选择一个...
TreePanel继承自Panel,它利用Ext.tree.TreeNode节点对象来构建树形结构,并提供了丰富的属性和方法供开发者使用,从而实现复杂的功能。 在TreePanel中,TreeNode节点代表树中的一个节点,它的常用属性包括: - ...
### ExtJs树形结构封装使用说明 #### 一、概述 在现代Web开发中,树形结构是非常常见的一种数据展示方式,特别是在企业级应用中,用于展现组织结构、文件系统等场景。ExtJs是一个功能强大的JavaScript框架,它提供...
在IT行业中,尤其是在Web开发领域,经常会遇到需要处理复杂数据结构和交互的场景,例如树形数据。ExtJS是一个强大的JavaScript库,它提供了丰富的组件来处理这类问题。本篇文章将聚焦于Ext JS中的一个特定功能——...
总的来说,带复选框的树在ExtJS 3.x中是一个强大的功能,它结合了树形结构和复选框的选择机制,为用户提供了一种直观且高效的方式来操作层级数据。理解和实现这样的功能,对提升ExtJS应用的用户体验至关重要。
ExtJs4 Checkbox Tree是基于ExtJs 4框架实现的一种特殊树形组件,它在传统的树形结构基础上增加了复选框功能。这种组件常用于需要用户多选树形数据的场景,比如权限设置、目录选择等。下面将详细介绍ExtJs4 Checkbox...
在实际应用中,我们经常需要处理树形结构的复选框,实现级联选择功能,即当父节点被选中时,其所有子节点自动被选中,反之亦然。这篇博客“Ext TreePanelrcheckbox级联选择的实现”就专注于探讨这个主题。 首先,...
TreeGrid是ExtJS 4中的一个组件,它结合了树形结构和表格的功能,允许用户以表格的形式查看和操作树节点。 在ExtJS 4中,TreeGrid是由TreePanel和GridPanel两种组件融合而成。TreePanel负责展示树形结构,而...