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 相关文章推荐
dojo 之基础篇
Mar 24 Javascript
Mootools 1.2 手风琴(Accordion)教程
Sep 15 Javascript
node.js中的fs.createReadStream方法使用说明
Dec 17 Javascript
js 获取范围内的随机数实例代码
Aug 02 Javascript
VueJS全面解析
Nov 10 Javascript
vue分类筛选filter方法简单实例
Mar 30 Javascript
vue.js系列中的vue-fontawesome使用
Feb 10 Javascript
js实现敏感词过滤算法及实现逻辑
Jul 24 Javascript
Vue实现本地购物车功能
Dec 05 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
Dec 24 Javascript
node+vue实现文件上传功能
May 28 Javascript
JavaScript async/await原理及实例解析
Dec 02 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
重置版宣传动画
2020/04/09 魔兽争霸
php中的时间显示
2007/01/18 PHP
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
PHP如何通过date() 函数格式化显示时间
2020/11/13 PHP
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
js实现的map方法示例代码
2014/01/13 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
基于jQuery滑动杆实现购买日期选择效果
2015/09/15 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
详解ES6中的let命令
2020/04/05 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
vue项目引入Iconfont图标库的教程图解
2018/10/24 Javascript
Vue多环境代理配置方法思路详解
2019/06/21 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
JS实现公告上线滚动效果
2021/01/10 Javascript
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
Python中的一些陷阱与技巧小结
2015/07/10 Python
利用Python学习RabbitMQ消息队列
2015/11/30 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
Python class的继承方法代码实例
2020/02/14 Python
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
英国复古服装和球衣购买网站:3Retro Football
2018/07/09 全球购物
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
办公室内勤工作职责
2013/12/11 职场文书
写给学生的新学期寄语
2014/01/18 职场文书
幼儿园元旦亲子活动方案
2014/02/17 职场文书
乔迁之喜主持词
2014/03/27 职场文书
安全生产目标责任书
2014/04/14 职场文书
2014年后备干部工作总结
2014/12/08 职场文书
五年级学生评语大全
2014/12/26 职场文书
项目合作意向书
2015/05/08 职场文书
2015年高三毕业班班主任工作总结
2015/10/22 职场文书
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android