`
chenxueyong
  • 浏览: 342128 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

EXTJS treecombox

阅读更多
今天写了一个后台的菜单管理页面,新增或修改树节点时,需要选择已经存在的节点作为父节点,于是想让一个combox作为载体显示一个树的widget,EXTJS并没有提供该控件,于是逛了逛一些论坛和网站,发现vifir的博客系统使用到了此控件,不过并没有提供源代码参考,没办法,自己写一个吧...

以下代码是扩展于combox的 DynamicTreeCombox,代码如下:
Java代码 复制代码
  1. Ext.ns("Ext.ux.form");   
  2. Ext.ux.form.DynamicTreeCombox= Ext.extend(Ext.form.ComboBox, {   
  3.     initComponent:function(){   
  4.         Ext.ux.form.DynamicTreeCombox.superclass.initComponent.call(this);   
  5.         this.addEvents('beforeClickNode','afterClickNode');   
  6.         if(!this.tree){   
  7.             this.tree=new Ext.tree.TreePanel({   
  8.                 containerScroll:true,   
  9.                 rootVisible:false,   
  10.                 root:new Ext.tree.AsyncTreeNode()   
  11.             });   
  12.             this.tree.loader=new Ext.tree.TreeLoader(this.loaderConfig||{dataUrl:"",baseAttrs:{}});   
  13.             this.tree.loader.addListener("beforeload",this.beforeLoad,this);   
  14.             this.tree.loader.addListener("load",this.onLoad,this);   
  15.             this.tree.addListener('collapsenode',this.onNodeCollapse,this);   
  16.             this.tree.addListener('expandnode',this.onNodeExpand,this);   
  17.         }   
  18.         var fieldMp={   
  19.             text:"text",   
  20.             qtip:"qtip",   
  21.             parentFuncId:"id",   
  22.             icon:"icon"  
  23.         };   
  24.         if(!this.fieldMapping){   
  25.             this.fieldMapping=fieldMp;   
  26.         }else{   
  27.             Ext.applyIf(this.fieldMapping,fieldMp);   
  28.         }   
  29.     },   
  30.        
  31.     initList:function(){   
  32.         if(!this.list){   
  33.             var cls = 'x-combo-list';   
  34.             this.list = new Ext.Layer({   
  35.                 shadow: this.shadow, cls: [cls, this.listClass].join(' '), constrain:false  
  36.             });   
  37.             var lw = this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth);   
  38.             this.list.setWidth(lw);   
  39.             this.list.swallowEvent('mousewheel');   
  40.             this.innerList = this.list.createChild({cls:cls+'-inner'});   
  41.             this.innerList.setWidth(lw - this.list.getFrameWidth('lr'));   
  42.             this.innerList.setHeight("100%");   
  43.         }   
  44.     },   
  45.        
  46.     doQuery:function(){   
  47.         if(this.expandAll){   
  48.             var loader=this.tree.loader;   
  49.             if(loader.baseAttrs){   
  50.                 Ext.apply(loader.baseAttrs,{expanded:this.expandAll});   
  51.             }else{   
  52.                 loader.baseAttrs={expanded:this.expandAll};   
  53.             }              
  54.         }   
  55.         if(!this.tree.rendered){   
  56.             this.tree.render(this.innerList);   
  57.             this.tree.addListener("click",this.clickNode,this);   
  58.         }   
  59.         this.expand();   
  60.     },   
  61.        
  62.     beforeLoad:function(loader,node){   
  63.         if(node!=node.getOwnerTree().root){                                                                                                                    
  64.             loader.baseParams.parentFuncId=node.attributes[this.fieldMapping.parentFuncId];                                                                                                                    
  65.         }   
  66.     },   
  67.        
  68.     onLoad:function(loader,node,res){   
  69.         var nodeArr=node.childNodes;   
  70.         for(var i=0,j=nodeArr.length;i<j;i++){   
  71.             if(nodeArr[i].attributes[this.fieldMapping.icon]){   
  72.                 nodeArr[i].getUI().getIconEl().src=nodeArr[i].attributes[this.fieldMapping.icon];   
  73.             }   
  74.             nodeArr[i].setText(nodeArr[i].attributes[this.fieldMapping.text]);   
  75.             nodeArr[i].ui.textNode.setAttribute("qtip", nodeArr[i].attributes[this.fieldMapping.qtip]);   
  76.         }      
  77.     },   
  78.        
  79.     clickNode:function(node){   
  80.         if(this.fireEvent('beforeClickNode',this,node)){   
  81.             this.setValue(node.attributes[this.displayField]);   
  82.         }   
  83.         this.fireEvent("afterClickNode",this,node);        
  84.         this.collapse();   
  85.     },   
  86.        
  87.     onNodeCollapse:function(node){   
  88.         this.list.setHeight(this.tree.getEl().getHeight()+2);   
  89.     },   
  90.        
  91.     onNodeExpand:function(node){   
  92.         this.list.setHeight(this.tree.getEl().getHeight()+2);   
  93.     },   
  94.        
  95.     onDestroy:function(){   
  96.         if(this.view){   
  97.             this.view.el.removeAllListeners();   
  98.             this.view.el.remove();   
  99.             this.view.purgeListeners();   
  100.         }   
  101.         if(this.tree.loader){   
  102.             this.tree.loader.purgeListeners();   
  103.         }   
  104.         if(this.tree){   
  105.             this.tree.el.removeAllListerers();   
  106.             this.tree.el.remove();   
  107.             this.tree.purgeListeners();   
  108.         }   
  109.         if(this.innerList){   
  110.             this.innerList.destroy();   
  111.         }   
  112.         if(this.list){   
  113.             this.list.destroy();   
  114.         }   
  115.         Ext.form.ComboBox.superclass.onDestroy.call(this);   
  116.     }   
  117. });   
  118.   
  119. Ext.reg("treecombox",Ext.ux.form.DynamicTreeCombox);  
Ext.ns("Ext.ux.form");
Ext.ux.form.DynamicTreeCombox= Ext.extend(Ext.form.ComboBox, {
	initComponent:function(){
		Ext.ux.form.DynamicTreeCombox.superclass.initComponent.call(this);
		this.addEvents('beforeClickNode','afterClickNode');
		if(!this.tree){
			this.tree=new Ext.tree.TreePanel({
				containerScroll:true,
				rootVisible:false,
				root:new Ext.tree.AsyncTreeNode()
			});
			this.tree.loader=new Ext.tree.TreeLoader(this.loaderConfig||{dataUrl:"",baseAttrs:{}});
			this.tree.loader.addListener("beforeload",this.beforeLoad,this);
			this.tree.loader.addListener("load",this.onLoad,this);
			this.tree.addListener('collapsenode',this.onNodeCollapse,this);
			this.tree.addListener('expandnode',this.onNodeExpand,this);
		}
		var fieldMp={
			text:"text",
			qtip:"qtip",
			parentFuncId:"id",
			icon:"icon"
		};
		if(!this.fieldMapping){
			this.fieldMapping=fieldMp;
		}else{
			Ext.applyIf(this.fieldMapping,fieldMp);
		}
	},
	
	initList:function(){
        if(!this.list){
            var cls = 'x-combo-list';
            this.list = new Ext.Layer({
                shadow: this.shadow, cls: [cls, this.listClass].join(' '), constrain:false
            });
            var lw = this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth);
            this.list.setWidth(lw);
            this.list.swallowEvent('mousewheel');
            this.innerList = this.list.createChild({cls:cls+'-inner'});
            this.innerList.setWidth(lw - this.list.getFrameWidth('lr'));
            this.innerList.setHeight("100%");
        }
    },
	
	doQuery:function(){
		if(this.expandAll){
			var loader=this.tree.loader;
			if(loader.baseAttrs){
				Ext.apply(loader.baseAttrs,{expanded:this.expandAll});
			}else{
				loader.baseAttrs={expanded:this.expandAll};
			}			
		}
		if(!this.tree.rendered){
			this.tree.render(this.innerList);
			this.tree.addListener("click",this.clickNode,this);
		}
		this.expand();
    },
    
    beforeLoad:function(loader,node){
    	if(node!=node.getOwnerTree().root){																													
			loader.baseParams.parentFuncId=node.attributes[this.fieldMapping.parentFuncId];																													
		}
    },
    
    onLoad:function(loader,node,res){
    	var nodeArr=node.childNodes;
		for(var i=0,j=nodeArr.length;i<j;i++){
			if(nodeArr[i].attributes[this.fieldMapping.icon]){
				nodeArr[i].getUI().getIconEl().src=nodeArr[i].attributes[this.fieldMapping.icon];
			}
			nodeArr[i].setText(nodeArr[i].attributes[this.fieldMapping.text]);
			nodeArr[i].ui.textNode.setAttribute("qtip", nodeArr[i].attributes[this.fieldMapping.qtip]);
		}	
    },
    
    clickNode:function(node){
    	if(this.fireEvent('beforeClickNode',this,node)){
    		this.setValue(node.attributes[this.displayField]);
    	}
    	this.fireEvent("afterClickNode",this,node); 	
    	this.collapse();
    },
    
    onNodeCollapse:function(node){
    	this.list.setHeight(this.tree.getEl().getHeight()+2);
    },
    
    onNodeExpand:function(node){
    	this.list.setHeight(this.tree.getEl().getHeight()+2);
    },
    
    onDestroy:function(){
        if(this.view){
            this.view.el.removeAllListeners();
            this.view.el.remove();
            this.view.purgeListeners();
        }
        if(this.tree.loader){
        	this.tree.loader.purgeListeners();
        }
        if(this.tree){
        	this.tree.el.removeAllListerers();
        	this.tree.el.remove();
            this.tree.purgeListeners();
        }
        if(this.innerList){
            this.innerList.destroy();
        }
        if(this.list){
            this.list.destroy();
        }
        Ext.form.ComboBox.superclass.onDestroy.call(this);
    }
});

Ext.reg("treecombox",Ext.ux.form.DynamicTreeCombox);


下面是调用的代码,已经加上了注释:
Java代码 复制代码
  1. Ext.QuickTips.init();   
  2. Ext.onReady(function(){   
  3.     var mycbo=new Ext.ux.form.DynamicTreeCombox({   
  4.         expandAll:false,//是否在点击combox时将树全部展开   
  5.         displayField:"nameLabelCode",//点击树节点时,将节点的哪个字段设置为combox的值   
  6.         fieldLabel:"Dynamic Tree Combo",   
  7.         readOnly:true,   
  8.         width:180,   
  9.         loaderConfig:{   
  10.             dataUrl:sys.Constants.ROOTPATH+"/sysmgr/SysMenu_list.do",//加载树的URL   
  11.             baseParams:{parentFuncId:""}//传递给后台的参数,其中parentFuncId是必须的,而且初始化为第一次加载时parentFuncId为空,即加载的是后台数据库的根节点   
  12.         },   
  13.         fieldMapping:{//因为我的后台程序返回的没有text qtip字段,故加上fieldMapping进行映射,如果后台返回的json有这几个字段,此属性可省略   
  14.             text:"nameLabelCode",//映射node的text字段   
  15.             qtip:"descriptionLabelCode",//映射node的qtip字段   
  16.             parentFuncId:"funcId"//映射动态请求后台时使用node的funcId字段作为请求参数   
  17.         }   
  18.     });   
  19.        
  20.     var myform=new Ext.form.FormPanel({   
  21.         renderTo:Ext.getBody(),   
  22.         width:350,   
  23.         height:100,   
  24.         frame:true,   
  25.         labelWidth:150,   
  26.         items:[mycbo]   
  27.     });   
  28. });  
Ext.QuickTips.init();
Ext.onReady(function(){
	var mycbo=new Ext.ux.form.DynamicTreeCombox({
		expandAll:false,//是否在点击combox时将树全部展开
		displayField:"nameLabelCode",//点击树节点时,将节点的哪个字段设置为combox的值
		fieldLabel:"Dynamic Tree Combo",
		readOnly:true,
		width:180,
		loaderConfig:{
			dataUrl:sys.Constants.ROOTPATH+"/sysmgr/SysMenu_list.do",//加载树的URL
			baseParams:{parentFuncId:""}//传递给后台的参数,其中parentFuncId是必须的,而且初始化为第一次加载时parentFuncId为空,即加载的是后台数据库的根节点
		},
		fieldMapping:{//因为我的后台程序返回的没有text qtip字段,故加上fieldMapping进行映射,如果后台返回的json有这几个字段,此属性可省略
			text:"nameLabelCode",//映射node的text字段
			qtip:"descriptionLabelCode",//映射node的qtip字段
			parentFuncId:"funcId"//映射动态请求后台时使用node的funcId字段作为请求参数
		}
	});
	
	var myform=new Ext.form.FormPanel({
		renderTo:Ext.getBody(),
		width:350,
		height:100,
		frame:true,
		labelWidth:150,
		items:[mycbo]
	});
});


贴上效果图:
[img]
http://www.iteye.com/upload/attachment/41240/4848558b-3532-38b7-9650-b32fc214bc73.jpg[/img]
  • 4848558b-3532-38b7-9650-b32fc214bc73-thumb
  • 大小: 27.8 KB
分享到:
评论
1 楼 rubbishvifir 2009-04-27  
好东东,收啦!!!

相关推荐

    extJs3升级extjs4方案

    ExtJS3 升级到 ExtJS4 方案 ExtJS3 升级到 ExtJS4 需要修改大量代码,主要是因为 ExtJS4 配备了一类新的系统,不向后兼容。在 ExtJS 3 里生成表的几个框架组件,ExtJS4 大多生成 div,这使得 CSS classes 将会失败...

    extjs流程界面设计器参考_ExtJS工作流设计器_extjs工作流_extjs_

    ExtJS是一种广泛使用的JavaScript库,专门用于构建富客户端的Web应用程序。它提供了丰富的组件和工具,使得开发者可以创建出功能强大、用户界面友好的Web应用。在“extjs流程界面设计器参考”中,我们主要关注的是...

    轻松搞定Extjs 带目录

    本书作为Extjs的中文教程,旨在帮助读者快速上手Extjs,其内容涉及Extjs的基础知识和实际应用。 #### 2. JavaScript基础知识 - **类的定义**: Extjs中的类继承于JavaScript原生类,通过Ext.extend来定义。这是...

    ExtJs3.3中文API.CHM_extjs3.3中文文档_

    ExtJS是一个广泛使用的JavaScript库,专门用于构建富客户端应用程序。版本3.3是该库的一个稳定版本,提供了许多功能和组件,使得Web开发者能够创建功能丰富的、交互性强的用户界面。这个“ExtJS3.3中文API.CHM”文档...

    包含各种类型的extjs小图标,Extjs4小图标

    ExtJS 是一个流行的JavaScript框架,主要用于构建富客户端的Web应用程序。它提供了丰富的组件库、数据管理功能以及强大的用户界面(UI)元素。在标题和描述中提到的“Extjs4小图标”指的是ExtJS 4版本中使用的一系列...

    ExtJS 7.6 SDK trial

    ExtJS 是一个流行的JavaScript框架,用于构建富客户端的Web应用程序。它提供了丰富的用户界面组件、数据绑定机制和强大的API,使开发者能够创建功能强大的、响应式的桌面和移动应用。7.6版本是ExtJS的一个重要更新,...

    Extjs4.1 小例子(适合extjs初学者学习使用)

    ExtJS 是一个强大的JavaScript前端框架,用于构建富客户端应用程序。版本4.1是该框架的一个重要里程碑,提供了许多新功能和改进。对于初学者来说,理解并掌握ExtJS 4.1的基础和特性是非常有益的。 标题中的"Extjs...

    ExtJS快速入门 ExtJS快速入门 ExtJS快速入门

    ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门ExtJS快速入门 ExtJS快速入门 ExtJS...

    ExtJS经典皮肤集合

    ExtJS是一款功能强大的JavaScript前端框架,它为开发者提供了构建富客户端Web应用的工具。这款框架以其丰富的组件库、可定制的界面和强大的数据绑定机制而闻名。标题中的"ExtJS经典皮肤集合"指的是该框架中包含的一...

    Extjs 2.2 Extjs 3.21 js

    ExtJS是一种广泛使用的JavaScript库,专门用于构建富客户端Web应用程序。这个压缩包包含了ExtJS的两个重要版本:2.2和3.2.1。这两个版本在Web开发领域都有着广泛的运用,它们各自拥有不同的特性和改进,对于理解...

    EXTJS讲解个人项目经历

    EXTJS 是一个强大的JavaScript前端框架,它主要用于构建富客户端应用,提供丰富的用户界面组件和灵活的可定制性。EXTJS 的核心在于其组件化的架构,允许开发者构建复杂的UI布局和功能丰富的应用程序。以下是对EXTJS...

    extjs 3.4 开发前准备

    【EXTJS 3.4 开发前准备】 EXTJS 是一款强大的JavaScript库,主要用于构建桌面级的Web应用程序,提供丰富的用户界面组件和交互效果。3.4版本是EXTJS的一个重要里程碑,它提供了稳定的基础和丰富的组件库。本文将...

    ExtJS 界面设计器

    ExtJS是一款强大的JavaScript库,主要用于构建富客户端的Web应用程序。其界面设计器,正如标题所示,是一种可视化的开发工具,能够极大地提升开发效率和用户体验。这个工具允许开发者通过拖放组件和直观地调整属性来...

    extJS4升级至extJS6.6所遇问题及解决方案

    项目进行前端框架升级——extJS 4升级至extJS6.6所遇的一些问题及相对应的解决方案建议

    ExtJS4ExtJS5MD5 加密

    适用于ExtJS4、ExtJS5 MD5加密算法!

    extjs6.2 SDK下载

    EXTJS 6.2 SDK是EXT JavaScript库的一个版本,它是一个强大的前端开发框架,用于构建企业级的Web应用程序。EXTJS提供了丰富的组件库,包括数据管理、图表、表格、窗体和其他用户界面元素,使开发者能够创建功能丰富...

    让我们开始EXTJS之旅EXTJS_WEB开发指南

    开始ExtJS之旅的第一步是要获得开发包,可以从官方网站www.ExtJS.com下载,以保证获 得最新版本。其下载地址是http://www.ExtJS.com/download,下载成功后的开发包是ExtJS- 2.0.2.zip,有6.08MB大。不过不用担心,这...

    EXTJS4自学手册

    一 Extjs 基础 EXTJS4自学手册——EXT文件目录,本地加载文档,命名规范 EXTJS4自学手册——EXT基本方法、属性(onReady、define、create) EXTJS4自学手册——EXT基本方法、属性(apply、applyIf、constructor) ...

    extjs中文文档大全

    ExtJS是一种基于JavaScript的开源富客户端框架,用于构建桌面级的Web应用程序。它提供了一整套组件化的用户界面元素和强大的数据绑定机制,使得开发者能够创建功能丰富的、交互性强的Web应用。本文档集合包括了...

Global site tag (gtag.js) - Google Analytics