自定义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 相关文章推荐
jQuery 学习第五课 Ajax 使用说明
May 17 Javascript
js打印纸函数代码(递归)
Jun 18 Javascript
AngularJS入门教程(二):AngularJS模板
Dec 06 Javascript
jQuery中:file选择器用法实例
Jan 04 Javascript
如何使用bootstrap框架 bootstrap入门必看!
Apr 13 Javascript
3分钟掌握常用的JS操作JSON方法总结
Apr 25 Javascript
vuex进阶知识点巩固
May 20 Javascript
layui实现数据表格自定义数据项
Oct 26 Javascript
vue 动态组件用法示例小结
Mar 06 Javascript
JavaScript实现HSL拾色器
May 21 Javascript
Vue-cli4 配置 element-ui 按需引入操作
Sep 11 Javascript
如何在面试中手写出javascript节流和防抖函数
Oct 22 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
我的php学习笔记(毕业设计)
2012/02/21 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
PHP延迟静态绑定示例分享
2014/06/22 PHP
php实现简单文件下载的方法
2015/01/30 PHP
Zend Framework前端控制器用法示例
2016/12/11 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
2017/08/11 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
JavaScript 学习 - 提高篇
2007/02/02 Javascript
Javascript实现页面跳转的几种方式分享
2013/10/26 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
2014/06/23 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
Vue.js实现简单ToDoList 前期准备(一)
2016/12/01 Javascript
JavaScript获取select中text值的方法
2017/02/13 Javascript
jQuery插件zTree实现获取一级节点数据的方法
2017/03/08 Javascript
JS二叉树的简单实现方法示例
2017/04/05 Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
python处理xml文件的方法小结
2017/05/02 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
2019/06/28 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
Python API len函数操作过程解析
2020/03/05 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
不用游标的SQL语句有哪些
2012/09/07 面试题
入党积极分子思想汇报范文
2014/01/05 职场文书
地球一小时宣传标语
2014/06/24 职场文书
街道务虚会发言材料
2014/10/20 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python