Extjs下拉树代码测试总结
http://blog.csdn.net/kunoy/article/details/8067801
首先主要代码源自网络,对那些无私的奉献者表示感谢!
笔者对这些代码做了二次修改,并总结如下:
Extjs3.x版本下拉树代码:
- Ext.ux.TreeCombo = Ext.extend(Ext.form.ComboBox, {
- constructor : function(cfg) {
- cfg = cfg || {};
- Ext.ux.TreeCombo.superclass.constructor.call(this, Ext.apply({
- maxHeight : 300,
- editable : false,
- mode : 'local',
- triggerAction : 'all',
- rootVisible : false,
- selectMode : 'all'
- }, cfg));
- },
- store : new Ext.data.SimpleStore({
- fields : [],
- data : [[]]
- }),
- // 重写onViewClick,使展开树结点是不关闭下拉框
- onViewClick : function(doFocus) {
- var index = this.view.getSelectedIndexes()[0], s = this.store, r = s.getAt(index);
- if (r) {
- this.onSelect(r, index);
- }
- if (doFocus !== false) {
- this.el.focus();
- }
- },
- tree : null,
- // 隐藏值
- hiddenValue : null,
- getHiddenValue : function() {
- return this.hiddenValue;
- },
- getValue : function() { //增加适用性,与原来combo组件一样
- return this.hiddenValue;
- },
- setHiddenValue : function(code, dispText) {
- this.setValue(code);
- Ext.form.ComboBox.superclass.setValue.call(this, dispText);
- this.hiddenValue = code;
- },
- initComponent : function() {
- var _this = this;
- var tplRandomId = 'deptcombo_' + Math.floor(Math.random() * 1000) + this.tplId
- this.tpl = "<div style='height:" + _this.maxHeight + "px' id='" + tplRandomId + "'></div>"
- this.tree = new Ext.tree.TreePanel({
- border : false,
- enableDD : false,
- enableDrag : false,
- rootVisible : _this.rootVisible || false,
- autoScroll : true,
- trackMouseOver : true,
- height : _this.maxHeight,
- lines : true,
- singleExpand : true,
- root : new Ext.tree.AsyncTreeNode({
- id : _this.rootId,
- text : _this.rootText,
- iconCls:'ico-root',
- expanded:true,
- leaf : false,
- border : false,
- draggable : false,
- singleClickExpand : false,
- hide : true
- }),
- loader : new Ext.tree.TreeLoader({
- nodeParameter:'ID',
- requestMethod:'GET',
- dataUrl : _this.url
- })
- });
- this.tree.on('click', function(node) {
- if ((_this.selectMode == 'leaf' && node.leaf == true) || _this.selectMode == 'all') {
- if(_this.fireEvent('beforeselect',_this,node)){
- _this.fireEvent('select',_this,node);
- }
- }
- });
- this.on('select',function(obj,node){
- var dispText = node.text;
- var code = node.id;
- obj.setHiddenValue(code, dispText);
- obj.collapse();
- });
- this.on('expand', function() {
- this.tree.render(tplRandomId);
- });
- Ext.ux.TreeCombo.superclass.initComponent.call(this);
- }
- })
- Ext.reg("treecombo", Ext.ux.TreeCombo);
使用方法:
- var treecombo=new Ext.ux.TreeCombo({
- name : 'areaName',
- tplId : 'tree_tpl',
- rootVisible : true,
- rootText : '/',
- rootId:'root',
- url : 'getTreeData.aspx', maxHeight :300,
- id: 'cmbJS',
- allowBlank: true,
- selectMode:'leaf',
- width : '200'
- });
Extjs4.x版本下拉树代码一:
- Ext.define('Ext.ux.TreeComboBox',{
- extend : 'Ext.form.field.ComboBox',
- alias: 'widget.treecombo',
- store : new Ext.data.ArrayStore({fields:[],data:[[]]}),
- editable : false,
- listConfig : {resizable:true,minWidth:100,maxWidth:400,minHeight:200,maxHeight:400},
- _idValue : null,
- _txtValue : null,
- treeObj: null,
- initComponent : function(){
- var _this = this;
- this.treeObj= new Ext.tree.Panel({
- border : false,
- id:Ext.id(),
- height : 380,
- width : 400,
- autoScroll : true,
- store : Ext.create('Ext.data.TreeStore', {
- fields : ['id','text','leaf'],
- autoLoad : false,
- nodeParam: 'ID',
- proxy: {
- type: 'ajax',
- url : _this.url
- },
- root: {
- expanded: _this.expanded||false,
- id:_this.rootId||'root',
- text : _this.rootText||'/'
- }
- })
- });
- this.treeRenderId = Ext.id();
- this.tpl = "<div id='"+this.treeRenderId+"'></div>";
- this.callParent(arguments);
- this.on({
- 'expand' : function(){
- if(!this.treeObj.rendered&&this.treeObj&&!this.readOnly){
- Ext.defer(function(){
- this.treeObj.render(this.treeRenderId);
- },300,this);
- }
- }
- });
- this.treeObj.on('itemclick',function(view,rec){
- if(rec&&((_this.selectMode == 'leaf' && rec.isLeaf() == true) || _this.selectMode == 'all')){
- this.setValue(this._txtValue = rec.get('text'));
- this._idValue = rec.get('id');
- this.collapse();
- _this.fireEvent('select',_this,rec);
- }
- },this);
- },
- getValue : function(){//获取id值
- return this._idValue;
- },
- getTextValue : function(){//获取text值
- return this._txtValue;
- },
- setLocalValue : function(id,txt){//设值
- this._idValue = id;
- this.setValue(this._txtValue = txt);
- },
- reLoad:function(id,url){
- this.treeObj.getStore().proxy.url =url;
- this.treeObj.setRootNode({
- id:id,
- text:'/',
- expanded:true
- });
- }
- });
使用方法与前面基本相同。这个版本存在很多问题,当一个界面存在两个下拉树时,其中一个下拉树在第二次下拉操作时,树不会显示,如图:
另外由于tree渲染到div上,当节点过多出现滚动条时,会显示两条滚动条,一条是div本身的,一条是treepanel的,如图:
所以此版本不采用,其中添加了一个reLoad()方法,这是由于两个下拉树需要联动才添加的。
Extjs4.x版本下拉树代码二:
- Ext.define("Ext.ux.ComboTree", {
- extend : "Ext.form.field.Picker",
- alias : 'widget.combotree',
- requires : ["Ext.tree.Panel"],
- _idValue : '',
- _txtValue : '',
- initComponent : function() {
- this.callParent();
- var self = this;
- var store = Ext.create('Ext.data.TreeStore', {
- proxy : {
- type : 'ajax',
- url : self.storeUrl
- },
- nodeParam: 'ID',
- root : {
- id : self.rootId,
- text : self.rootText,
- expanded:self.expanded||false
- }
- });
- self.picker = new Ext.tree.Panel({
- id:Ext.id(),
- height : self.treeHeight||300,
- resizable:true,minWidth:100,maxWidth:400,minHeight:200,maxHeight:500,
- autoScroll : true,
- floating : true,
- focusOnToFront : false,
- shadow : true,
- ownerCt : this.ownerCt,
- useArrows : self.useArrows||true,
- store : store,
- rootVisible : true
- });
- self.picker.on({
- 'itemclick' : function(view,rec) {
- if(rec&&((self.selectMode == 'leaf' && rec.isLeaf() == true) || self.selectMode == 'all')){
- //self.setRawValue(rec.get('id'));// 隐藏值
- self._idValue = rec.get('id');
- self.setValue(self._txtValue=rec.get('text'));// 显示值
- self.collapse();
- self.fireEvent('select',self,rec);
- }
- }
- });
- },
- // createPicker : function() {
- // var self = this;
- // var store = Ext.create('Ext.data.TreeStore', {
- // proxy : {
- // type : 'ajax',
- // url : self.storeUrl
- // },
- // nodeParam: 'ID',
- // root : {
- // id : self.rootId,
- // text : self.rootText,
- // expanded:self.expanded||true
- // }
- // });
- // self.picker = new Ext.tree.Panel({
- // id:Ext.id(),
- // height : 300,
- // //resizable:true,minWidth:100,maxWidth:400,minHeight:200,maxHeight:400,
- // autoScroll : true,
- // floating : true,
- // focusOnToFront : false,
- // shadow : true,
- // ownerCt : this.ownerCt,
- // useArrows : self.useArrows||true,
- // store : store,
- // rootVisible : true
- // });
- // self.picker.on({
- // 'itemclick' : function(view,rec) {
- // if(rec&&((self.selectMode == 'leaf' && rec.isLeaf() == true) || self.selectMode == 'all')){
- // //self.setRawValue(rec.get('id'));// 隐藏值
- // self._idValue = rec.get('id');
- // self.setValue(self._txtValue=rec.get('text'));// 显示值
- // self.collapse();
- // self.fireEvent('select',self,rec);
- // }
- // }
- // });
- // return self.picker;
- // },
- getValue : function(){//获取id值
- return this._idValue;
- },
- getTextValue : function(){//获取text值
- return this._txtValue;
- },
- reLoad:function(id,url){
- var store=this.picker.getStore();
- var root=this.picker.getRootNode();
- store.proxy.url =url;
- root.set('id',id);
- store.load();
- },
- alignPicker : function() {
- var me = this, picker, isAbove, aboveSfx = '-above';
- if (this.isExpanded) {
- picker = me.getPicker();
- if (me.matchFieldWidth) {
- picker.setWidth(me.bodyEl.getWidth());
- }
- if (picker.isFloating()) {
- picker.alignTo(me.inputEl, "", me.pickerOffset);
- isAbove = picker.el.getY() < me.inputEl.getY();
- me.bodyEl[isAbove ? 'addCls' : 'removeCls'](me.openCls+ aboveSfx);
- picker.el[isAbove ? 'addCls' : 'removeCls'](picker.baseCls+ aboveSfx);
- }
- }
- }
- });
此版本解决了上述两大问题,其中注解的部分为原作者代码,使用createPicker存在一个问题,必须点击下拉操作后,treepanel才会进行渲染,那么数据联动也就谈不上了(需要联动的tree没有渲染,如何进行数据加载?),所以笔者移到initComponent下执行,另外也解决了resize的问题。
使用方法:
- var treecombo=new Ext.ux.ComboTree({
- fieldLabel: 'Test',
- labelWidth: 60,
- rootText : '/',
- rootId:'root',
- expanded:true,
- storeUrl : 'getTreeData.aspx',
- id: 'cmbJS',
- selectMode:'leaf',
- treeHeight:300,
- width : 200
- });
到此,Extjs4.1的下拉树完美了,世界太平了!
Extjs下拉树代码测试总结的更多相关文章
- EXTJS下拉树ComboBoxTree参数提交及回显方法
http://blog.csdn.net/wjlht/article/details/6085245 使用extjs可以构造出下拉数,但是不方便向form提交参数,在此,笔者想到一个办法,很方便Com ...
- zTree开发下拉树
最近,因为工作需要一个树形下拉框的组件,经过查资料一般有两种的实现方法.其一,就是使用zTree实现:其二,就是使用easyUI实现.因为公司的前端不是使用easyUI设计的,故这里我选择了zTree ...
- zTree插件之多选下拉菜单代码
zTree插件之多选下拉菜单代码 css和js <!--ztree树结构--> <link rel="stylesheet" type="text/cs ...
- 开源框架.netCore DncZeus学习(五)下拉树的实现
千里之行,始于足下,先从一个小功能研究起,在菜单管理页面有一个下拉树,先研究下它怎么实现的 1.先找到menu.vue页面 惯性思维先搜索请选择三个字,原来是动态生成的 再向上找DropDown组件, ...
- Extjs 下拉框
刚刚熟练了easyui控件的使用,又開始了如今的这个项目. 这个项目是个半成品.前端使用的是Extjs控件,jsp中没有代码.就引用了非常多的js...于是乎有种不知所措了呀. . . 说实话特别的不 ...
- vue-Treeselect实现组织机构(员工)下拉树的功能
知识点:前端使用vuetree的组件库,调用后台查询组织机构,包括人员的接口 实现下拉树的功能 查考: vue-treeselect官网:https://vue-treeselect.js.org/ ...
- layui扩展组件,下拉树多选
项目介绍 项目中需要用到下拉树多选功能,找到两个相关组件moretop-layui-select-ext和wujiawei0926-treeselect,但是moretop-layui-selec ...
- elementUI下拉树组件封装
使用组件:Popover 弹出框.Tree 树形控件 和 input 输入框 用法: 1.新建一个.vue文件,粘贴以下组件封装的代码(完全可以使用) 2.在页面需要使用下拉树的地方调用即可. (1) ...
- 可控制导航下拉方向的jQuery下拉菜单代码
效果:http://hovertree.com/texiao/nav/1/ 代码如下: <!DOCTYPE html> <html> <head> <meta ...
随机推荐
- MySQL常见错误代码说明
附:MySQL常见错误代码说明 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导致删除数据 ...
- ubuntu无法获得锁 /var/lib/dpkg -open 问题
问题: 方法: sudo rm /var/lib/dpkg/lock 然后再安装就可以了
- 关于boost 的smart_ptr 的使用问题
boost 的smart_ptr 库中含有好几种智能指针,大家用的最多的应该是shared_ptr ,为啥呢?好用,不用管他啥时候会自动删除等等,而且拷贝和复制都很到位, 但实际上,这个库也有问题,连 ...
- [How to] 使用HBase协处理器---Endpoint客户端代码的实现
1.简介 不同于Observer协处理器,EndPoint由于需要同region进行rpc服务的通信,以及客户端出数据的归并,需要自行实现客户端代码. 基于[How to] 使用HBase协处理器-- ...
- .pnts点云
一种3d tiles格式 MIME格式: <configuration> <system.webServer> <staticContent> <remove ...
- 将table导出为excel格式文件
html: <table cellpadding="0" cellspacing="0" class="data_table" id= ...
- 【前端笔记】浅谈js继承
我们先想想我们用js最后要怎样实现面向对象的编程.事实上我们必须用上原型链这种东西. 我们的父类superType有属性和方法,并且一些能被子类subType继承,一些能被覆盖,但是丝毫不会影响到父类 ...
- Mybatis的关联映射
实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系.针对多表之间的操作,MyBatis提供了关联映射, 通过关联映射就可以很好的处理对象与对象之间的关联关 ...
- C++中对已分配空间的指针调用一个类的构造函数
在看MINIBASE的源代码的时候发现里面有类似于这样的东西 bufTable = (BufDesc*) MINIBASE_SHMEM->malloc( numBuffers * sizeof( ...
- Hadoop案例(九)流量汇总案例
流量汇总程序案例 1.自定义输出 统计手机号耗费的总上行流量.下行流量.总流量(序列化) 1)需求: 统计每一个手机号耗费的总上行流量.下行流量.总流量 2)数据准备 phone_date.txt - ...