在使用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版本为4.1.1a,在struts2下测试通过。例子仅供提供思路,简单易懂,不负责代码优化,哈哈!
ExtJs树形结构 ext的简单应用ExtJs树形结构 ext的简单应用ExtJs树形结构 ext的简单应用ExtJs树形结构 ext的简单应用ExtJs树形结构 ext的简单应用
extjs实现简单的树状结构级联Ext onReady function { Ext QuickTips init ; Ext BLANK IMAGE URL "extjs resources images default s gif"; var mytree new Ext tree TreePanel { el : "...
extjs 树形下拉列表框,可以进行数据选择,数据回显。
将文件拷贝到extjs根目录下。运行即可。实现了选中之类。父类联动选中
主要介绍了Extjs 中 Treepanel 实现菜单级联选中效果,需要的朋友可以参考下
easyui或extjs构建动态树形结构,程序详细解析了怎么构建、组织树形结构,代码简单明了,有相应的注释说明,真正的授人予渔.只要你明白程序的逻辑,相信上面两种组件的树形结构,将不会有任何问题。
Extjs4下拉树菜单 ComboBoxTree 支持单选和多选并且支持展开选中指定节点的通用控件 在项目中已经成熟运用 值得收藏和运用
使用ExtJs构建树形菜单功能,很实用的东西。
extjs树形结构实现系统主界面功能框架借鉴.pdf
extjs实现动态树
主要是Ext JS 深入浅出 树形结构博客源代码实现,树形结构的节点实现,展开子叶设置等功能
使用extjs+ibatis+spring+struts开发的权限系统 数据库mysql 数据库文件在开发文档目录下 动态树形菜单的加载 ,用户角色权限菜单的维护 jar文件删了一些,需要用的自己加包
引用ExtJS5.0 实现一个树形菜单的后台管理demo
extjs实现动态树加载菜单
使用ExtJs2.0+SSH开发的结构,可以进行文件上传,以及数据的管理,用户的登录,通过数据库数据操行操作树形结构等功能
Js类,方法说明,事件响应,ExtJs_树形机构封装使用说明
Extjs 下拉树 下拉多选树 支持多选 全选/全不选 下拉多选框
PS:之后的功能设计中,会发现很多的功能都是重复出现的,就可以考虑建立视图时通过继承的方式来实现,而不需要过多的重复。