自定义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 相关文章推荐
passwordStrength 基于jquery的密码强度检测代码使用介绍
Oct 08 Javascript
分页栏的web标准实现
Nov 01 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
Feb 20 Javascript
一个JavaScript去除字符串末尾的空白实例代码
Sep 22 Javascript
JavaScript设计模式之策略模式实例
Oct 10 Javascript
详解JavaScript对W3C DOM模版的支持情况
Jun 16 Javascript
创建自己的jquery表格插件
Nov 25 Javascript
jQuery使用zTree插件实现树形菜单和异步加载
Feb 25 Javascript
vue2.X组件学习心得(新手必看篇)
Jul 05 Javascript
react 创建单例组件的方法
Apr 26 Javascript
swiper4实现移动端导航切换
Oct 16 Javascript
JS前端宏任务微任务及Event Loop使用详解
Jul 23 Javascript
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
如何让CI框架支持service层
2014/10/29 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
php基础教程
2015/08/26 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
2016/07/18 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
php的instanceof和判断闭包Closure操作示例
2020/01/26 PHP
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
2015/09/05 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
jquery中done和then的区别(详解)
2017/12/19 jQuery
jQuery实现右侧抽屉式在线客服功能
2017/12/25 jQuery
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
vue单文件组件lint error自动fix与styleLint报错自动fix详解
2019/01/08 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
Vue动态生成表格的行和列
2019/07/18 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
python追加元素到列表的方法
2015/07/28 Python
Python中input与raw_input 之间的比较
2017/08/20 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
Python Django 命名空间模式的实现
2019/08/09 Python
Python ini文件常用操作方法解析
2020/04/26 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
纽约香氛品牌:NEST Fragrance
2018/10/15 全球购物
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
《动手做做看》教学反思
2014/04/09 职场文书
旅游饭店管理专业自荐书
2014/06/28 职场文书
乡镇党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
山楂树之恋观后感
2015/06/11 职场文书
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL