ExtJs扩展之GroupPropertyGrid代码


Posted in Javascript onMarch 05, 2010

ExtJs本身就提供了丰富的空间和良好的界面开发,就如同WinForm的开发一样。但是ExtJs的空间也有不完美的地方,但是有缺点也有他自己的弥补方法。ExtJs的良好的扩展性就是ExtJs自己控件不能实现的最好的方法。
这几个中使用最多的当属ExtJs的PropertyGrid,ExtJs的PropertyGrid使用起来时相当简单的,在ExtJs的官方网站上也有相应的例子,简单的就不在叙述了。但是ExtJs本身的PropertyGrid不能支持分组,在显示的不能将属性进行分组,这是相当郁闷的。不知道为什么ExtJs不提供这样的方法和接口。
于是在网上Google了许久,网上也有类似的内容,叫做《扩展组件:GroupingView+ PropertyGrid (蒙牛版)》。楼主写的很好,但是不知道为什么没有将源码贴上。网上也没有其他的好的建议。无奈中,只能自己花点时间去写个吧。于是打开了ExtJs的源代码,找到了PropertyGrid的源文件,一看,还是比较简单的,
其中几个主要内容就是:
PropertyRecord
PropertyStore
PropertyColumnModel
PropertyGrid
于是拷贝了全部的源代码,创建了文件名为Ext.ux.grid.GroupPropertyGrid.js的脚本文件,并测试值,成功通过,开始阅读PropertyGrid的源代码,发现了以下几个问题:
1、PropertyRecord这个种的内容太少了,仅有name和value,
2、PropertyStore使用的是Ext.data.Store,而没有使用Ext.data.GroupingStore
3、PropertyStore使用的数据中不支持分组,并且更新的时候没有对分组进行处理
而PropertyGrid确实继承EditorGridPanel,这个本身就是可以支持Group分组的,这样PropertyGrid中就不需要修改了。
下面就对这几个问题进行修改,让他支持分组:
1、修改PropertyRecord,添加Group字段。

Ext.ux.grid.GroupPropertyRecord=Ext.data.Record.create( 
[{name:"name",type:"string"},"value","group"] 
);

2、修改PropertyStore以支持GroupingStore

Ext.ux.grid.GroupPropertyStore = function(grid, source){ 
this.grid = grid; 
this.store = new Ext.data.GroupingStore({ 
recordType : Ext.ux.grid.GroupPropertyRecord, 
groupField : "group" 
}); 
this.store.on('update', this.onUpdate, this); 
if(source){ 
this.setSource(source); 
} 
Ext.ux.grid.GroupPropertyStore.superclass.constructor.call(this); 
}; 
Ext.extend(Ext.ux.grid.GroupPropertyStore, Ext.util.Observable, { 
setSource : function(o){ 
this.source = o; 
this.store.removeAll(); 
var data = []; 
for(var k in o){ 
if(this.isEditableValue(o[k])){ 
data.push(new Ext.ux.grid.GroupPropertyRecord({name: k, value: o[k],group:k},k)); 
} 
else if(typeof(o[k]) == 'object'){ 
for(var n in o[k]){ 
data.push(new Ext.ux.grid.GroupPropertyRecord({name: n, value: o[k][n],group:k},k+"&&"+n)); 
} 
} 
} 
this.store.loadRecords({records: data}, {}, true); 
}, // private 
onUpdate : function(ds, record, type){ 
if(type == Ext.data.Record.EDIT){ 
var v = record.data['value']; 
var oldValue = record.modified['value']; 
if(this.grid.fireEvent('beforepropertychange', this.source, record.id, v, oldValue) !== false){ 
if(record.id.indexOf("&&")!=-1) 
{ 
var values = record.id.split("&&"); 
this.source[values[0]][values[1]] = v; 
} 
else 
{ 
this.source[record.id] = v; 
} 
record.commit(); 
this.grid.fireEvent('propertychange', this.source, record.id, v, oldValue); 
}else{ 
record.reject(); 
} 
} 
}, 
// private 
getProperty : function(row){ 
return this.store.getAt(row); 
}, 
// private 
isEditableValue: function(val){ 
if(Ext.isDate(val)){ 
return true; 
}else if(typeof val == 'object' || typeof val == 'function'){ 
return false; 
} 
return true; 
}, 
// private 
setValue : function(prop, value){ 
this.source[prop] = value; 
this.store.getById(prop).set('value', value); 
}, 
// protected - should only be called by the grid. Use grid.getSource instead. 
getSource : function(){ 
return this.source; 
} 
});

主要修改了SetSource,onUpdate这两个方法,并且修改了Store为GroupingStore。这样在去测试,就成功的可以看到PropertyGrid已经可以分组了。效果图如下:
ExtJs扩展之GroupPropertyGrid代码
这样整个工作就完成了。

全部的源代码下载: http://xiazai.3water.com/201003/yuanma/GroupPropertyGrid.rar

Javascript 相关文章推荐
asp.net中System.Timers.Timer的使用方法
Mar 20 Javascript
使用百度地图api实现根据地址查询经纬度
Dec 11 Javascript
node.js中的http.response.removeHeader方法使用说明
Dec 14 Javascript
angularJS 中$scope方法使用指南
Feb 09 Javascript
jQuery插件bxSlider实现响应式焦点图
Apr 12 Javascript
vue实现百度搜索下拉提示功能实例
Jun 14 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
Jun 15 Javascript
JS实现按钮添加背景音乐示例代码
Oct 17 Javascript
基于JS实现html中placeholder属性提示文字效果示例
Apr 19 Javascript
在Vue中使用axios请求拦截的实现方法
Oct 25 Javascript
详解如何使用node.js的开发框架express创建一个web应用
Dec 20 Javascript
vue 实现小程序或商品秒杀倒计时
Apr 14 Javascript
js 获取服务器控件值的代码
Mar 05 #Javascript
jquery checkbox全选、取消全选实现代码
Mar 05 #Javascript
javascript 隐藏/显示指定的区域附HTML元素【legend】用法
Mar 05 #Javascript
ExtJS 工具栏 分页事件参数
Mar 05 #Javascript
Microsoft Ajax Minifier 压缩javascript的方法
Mar 05 #Javascript
javascript 浏览器检测代码精简版
Mar 04 #Javascript
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
Mar 04 #Javascript
You might like
php自定义函数之递归删除文件及目录
2010/08/08 PHP
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
简单分析ucenter 会员同步登录通信原理
2014/08/25 PHP
php实现删除指定目录下相关文件的方法
2014/10/20 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
php生成短域名函数
2015/03/23 PHP
Symfony生成二维码的方法
2016/02/04 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
[41:52]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第二场 2月22日
2021/03/11 DOTA
Python打印斐波拉契数列实例
2015/07/07 Python
python杀死一个线程的方法
2015/09/06 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
Python3 max()函数基础用法
2019/02/19 Python
Python批量安装卸载1000个apk的方法
2020/04/10 Python
Django 构建模板form表单的两种方法
2020/06/14 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
美国电子产品折扣网站:Daily Steals
2017/05/20 全球购物
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
护理专业推荐信
2013/11/07 职场文书
项目管理计划书
2014/01/09 职场文书
销售人员求职的自我评价分享
2014/03/15 职场文书
反腐倡廉演讲稿
2014/05/22 职场文书
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫
Mybatis-Plus 使用 @TableField 自动填充日期
2022/04/26 Java/Android