自定义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.load的方法可以一直load下去
Mar 28 Javascript
用Jquery.load载入页面实现局部刷新
Jan 22 Javascript
自己使用js/jquery写的一个定制对话框控件
May 02 Javascript
原生js实现移动开发轮播图、相册滑动特效
Apr 17 Javascript
AngularJS  $on、$emit和$broadcast的使用
Sep 05 Javascript
BootStrap 标题设置跨行无效的解决方法
Oct 25 Javascript
jQuery实现所有验证通过方可提交的表单验证
Nov 21 jQuery
原生js+cookie实现购物车功能的方法分析
Dec 21 Javascript
使用vue自定义指令开发表单验证插件validate.js
May 23 Javascript
vue中对象数组去重的实现
Feb 06 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
Feb 19 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
Apr 07 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 AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
CodeIgniter启用缓存和清除缓存的方法
2014/06/12 PHP
php获取QQ头像并显示的方法
2014/12/23 PHP
Symfony2 session用法实例分析
2016/02/04 PHP
PHP开发中csrf攻击的简单演示和防范
2017/05/07 PHP
网页里控制图片大小的相关代码
2006/06/13 Javascript
jQuery知识点整理
2015/01/30 Javascript
javascript制作2048游戏
2015/03/30 Javascript
jQuery validate插件实现ajax验证重复的2种方法
2016/01/22 Javascript
AngularJS 使用 UI Router 实现表单向导
2016/01/29 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
深入理解JQuery循环绑定事件
2016/06/02 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
让Vue也可以使用Redux的方法
2018/05/23 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
2019/12/26 Javascript
python服务器与android客户端socket通信实例
2014/11/12 Python
Python 图像对比度增强的几种方法(小结)
2019/09/25 Python
python实现宿舍管理系统
2019/11/22 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
关于Python错误重试方法总结
2021/01/03 Python
美国在线旅行社:Crystal Travel
2018/09/11 全球购物
工作决心书
2014/03/11 职场文书
海飞丝的广告词
2014/03/20 职场文书
美术专业自荐信
2014/07/07 职场文书
保险公司演讲稿
2014/09/02 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
整改通知书格式
2015/04/22 职场文书
孔繁森观后感
2015/06/10 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
导游词之云南丽江古城
2019/09/17 职场文书
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS
Mysql中有关Datetime和Timestamp的使用总结
2021/12/06 MySQL