自定义ExtJS控件之下拉树和下拉表格附源码


Posted in Javascript onOctober 15, 2013

简介

在Ext官方的例子中只有下拉列表控件,但是在实际业务中只有下拉列表无法满足需求的,像下拉树和下拉表格都是很常见的控件,对于刚使用Ext的人来说,自定义一个控件好难,其实多读官方的源码有些事情就不会那么难了。下面是下拉树的代码:

Ext.define('ComboTreeBox',{ 
extend : 'Ext.form.field.ComboBox', multiSelect : true, 
createPicker : function(){ 
var me = this; 
//创建树控件 
var picker = Ext.create('Ext.tree.Panel', { 
store: me.store, 
rootVisible: false, 
selModel: { 
mode: me.multiSelect ? 'SIMPLE' : 'SINGLE' 
}, 
floating: true, 
hidden: true, 
focusOnToFront: false 
}); 
//注册事件用于选择用户选择的值 
me.mon(picker, { 
itemclick: me.onItemClick, 
refresh: me.onListRefresh, 
scope: me 
}); 
me.mon(picker.getSelectionModel(), { 
beforeselect: me.onBeforeSelect, 
beforedeselect: me.onBeforeDeselect, 
selectionchange: me.onListSelectionChange, 
scope: me 
}); 
this.picker = picker; 
return picker; 
}, 
onItemClick: function(picker, record){ 
/* 
* If we're doing single selection, the selection change events won't fire when 
* clicking on the selected element. Detect it here. 
*/ 
var me = this, 
selection = me.picker.getSelectionModel().getSelection(), 
valueField = me.valueField; 
if (!me.multiSelect && selection.length) { 
if (record.get(valueField) === selection[0].get(valueField)) { 
// Make sure we also update the display value if it's only partial 
me.displayTplData = [record.data]; 
me.setRawValue(me.getDisplayValue()); 
me.collapse(); 
} 
} 
} 
});

下拉树的代码很简单,只要集成Ext.form.field.ComboBox类,然后重写createPicker方法就可以了,同理下拉表格也是如此,下面是下拉表格的代码:
Ext.define('ComboGridBox',{ 
extend : 'Ext.form.field.ComboBox', multiSelect : true, 
createPicker : function(){ 
var me = this; 
var picker = Ext.create('Ext.grid.Panel', { 
title : '下拉表格', 
store: me.store, 
frame : true, 
resizable : true, 
columns : [{ 
text : '#ID', 
dataIndex : 'id' 
},{ 
text : '名称' , 
dataIndex : 'name' 
},{ 
text : '描述' , 
dataIndex : 'desc' 
}], 
selModel: { 
mode: me.multiSelect ? 'SIMPLE' : 'SINGLE' 
}, 
floating: true, 
hidden: true, 
width : 300, 
columnLines : true, 
focusOnToFront: false 
}); 
me.mon(picker, { 
itemclick: me.onItemClick, 
refresh: me.onListRefresh, 
scope: me 
}); 
me.mon(picker.getSelectionModel(), { 
beforeselect: me.onBeforeSelect, 
beforedeselect: me.onBeforeDeselect, 
selectionchange: me.onListSelectionChange, 
scope: me 
}); 
this.picker = picker; 
return picker; 
}, 
onItemClick: function(picker, record){ 
/* 
* If we're doing single selection, the selection change events won't fire when 
* clicking on the selected element. Detect it here. 
*/ 
var me = this, 
selection = me.picker.getSelectionModel().getSelection(), 
valueField = me.valueField; 
if (!me.multiSelect && selection.length) { 
if (record.get(valueField) === selection[0].get(valueField)) { 
// Make sure we also update the display value if it's only partial 
me.displayTplData = [record.data]; 
me.setRawValue(me.getDisplayValue()); 
me.collapse(); 
} 
} 
}, 
matchFieldWidth : false, 
onListSelectionChange: function(list, selectedRecords) { 
var me = this, 
isMulti = me.multiSelect, 
hasRecords = selectedRecords.length > 0; 
// Only react to selection if it is not called from setValue, and if our list is 
// expanded (ignores changes to the selection model triggered elsewhere) 
if (!me.ignoreSelection && me.isExpanded) { 
if (!isMulti) { 
Ext.defer(me.collapse, 1, me); 
} 
/* 
* Only set the value here if we're in multi selection mode or we have 
* a selection. Otherwise setValue will be called with an empty value 
* which will cause the change event to fire twice. 
*/ 
if (isMulti || hasRecords) { 
me.setValue(selectedRecords, false); 
} 
if (hasRecords) { 
me.fireEvent('select', me, selectedRecords); 
} 
me.inputEl.focus(); 
} 
console.log(me.getValue()); 
}, 
doAutoSelect: function() { 
var me = this, 
picker = me.picker, 
lastSelected, itemNode; 
if (picker && me.autoSelect && me.store.getCount() > 0) { 
// Highlight the last selected item and scroll it into view 
lastSelected = picker.getSelectionModel().lastSelected; 
itemNode = picker.view.getNode(lastSelected || 0); 
if (itemNode) { 
picker.view.highlightItem(itemNode); 
picker.view.el.scrollChildIntoView(itemNode, false); 
} 
} 
} 

});

下拉表格也是继承了Ext.form.field.ComboBox这个类,重写了createPicker方法。

开发下拉树和下拉表格看起来so easy,只要研究透了Ext的运行机制,一切都会so easy

控件效果
自定义ExtJS控件之下拉树和下拉表格附源码 
自定义ExtJS控件之下拉树和下拉表格附源码

实例下载

实例中的资源为myeclipse项目,导入即可运行,自己添加ext的js和css文件,实例中没有ext的基础文件。
下载地址

Javascript 相关文章推荐
JavaScript 学习笔记(四)
Dec 31 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
Oct 17 Javascript
JavaScript函数模式详解
Nov 07 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
Sep 08 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
Nov 02 Javascript
JavaScript实现Fly Bird小游戏
Dec 15 Javascript
自学实现angularjs依赖注入
Dec 20 Javascript
vue-cli常用设置总结
Feb 24 Javascript
vue实现element-ui对话框可拖拽功能
Aug 17 Javascript
React精髓!一篇全概括小结(急速)
May 23 Javascript
Vue项目实现简单的权限控制管理功能
Jul 17 Javascript
Vue提供的三种调试方式你知道吗
Jan 18 Vue.js
Javascript 实现的数独解题算法网页实例
Oct 15 #Javascript
高效的获取当前元素是父元素的第几个子元素
Oct 15 #Javascript
JS 实现点击a标签的时候让其背景更换
Oct 15 #Javascript
JS操作Cookies的小例子
Oct 15 #Javascript
如何在父窗口中得知window.open()出的子窗口关闭事件
Oct 15 #Javascript
JavaScript中prototype为对象添加属性的误区介绍
Oct 15 #Javascript
JS格式化数字保留两位小数点示例代码
Oct 15 #Javascript
You might like
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
js实现文本框选中的方法
2015/05/26 Javascript
Javascript函数的参数
2015/07/16 Javascript
jquery实现红色竖向多级向右展开的导航菜单效果
2015/08/31 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
2018/08/13 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
2020/10/28 Javascript
[02:10]2018DOTA2亚洲邀请赛赛前采访-Liquid
2018/04/03 DOTA
python局域网ip扫描示例分享
2014/04/03 Python
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
用Python实现换行符转换的脚本的教程
2015/04/16 Python
python基础教程之匿名函数lambda
2017/01/17 Python
老生常谈Python之装饰器、迭代器和生成器
2017/07/26 Python
Python字典,函数,全局变量代码解析
2017/12/18 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
python集合是否可变总结
2019/06/20 Python
基于python实现文件加密功能
2020/01/06 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
澳大利亚百货公司:David Jones
2018/02/08 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
仓管员岗位职责范文
2013/11/08 职场文书
公证委托书
2014/08/01 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
tree shaking对打包体积优化及作用
2022/07/07 Java/Android