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 相关文章推荐
正则表达式语法
Oct 09 Javascript
jquery下checked取值问题的解决方法
Aug 09 Javascript
Js base64 加密解密介绍
Oct 11 Javascript
制作jquery遮罩层效果导航菜单代码分享
Dec 25 Javascript
原生js模拟淘宝购物车项目实战
Nov 18 Javascript
location.hash保存页面状态的技巧
Apr 28 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
Jul 14 Javascript
详解RequireJs官方使用教程
Oct 31 Javascript
基于JavaScript中字符串的match与replace方法(详解)
Dec 04 Javascript
jQuery 实现倒计时天,时,分,秒功能
Jul 31 jQuery
JavaScript Math对象和调试程序的方法分析
May 13 Javascript
详解关于Vue单元测试的几个坑
Apr 26 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
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
php版淘宝网查询商品接口代码示例
2014/06/17 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
Javascript 篱式条件判断
2008/08/22 Javascript
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
如何在JS中实现相互转换XML和JSON
2016/07/19 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
2017/04/13 Javascript
微信小程序 swiper组件构建轮播图的实例
2017/09/20 Javascript
浅谈Vue.nextTick 的实现方法
2017/10/25 Javascript
原生JavaScript实现remove()和recover()功能示例
2018/07/24 Javascript
AngularJS与后端php的数据交互方法
2018/08/13 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
微信小程序中如何使用flyio封装网络请求
2019/07/03 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
Python 面向对象 成员的访问约束
2008/12/23 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
Python sklearn KFold 生成交叉验证数据集的方法
2018/12/11 Python
python如何实现不可变字典inmutabledict
2020/01/08 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
2020/12/08 Python
Fanatics法国官网:美国体育电商
2019/08/27 全球购物
使用C#编写创建一个线程的代码
2013/01/22 面试题
求职者简历中的自我评价
2013/10/20 职场文书
五年级音乐教学反思
2014/02/06 职场文书
高中国旗下的演讲稿
2014/08/28 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
租车协议书范本2014
2014/11/17 职场文书
基于Nginx实现限制某IP短时间访问次数
2021/03/31 Servers
聊聊golang中多个defer的执行顺序
2021/05/08 Golang
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript