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 相关文章推荐
jQuery 第二课 操作包装集元素代码
Mar 14 Javascript
基于jquery的不规则矩形的排列实现代码
Apr 16 Javascript
Js中的onblur和onfocus事件应用介绍
Aug 27 Javascript
简单的Jquery全选功能
Nov 07 Javascript
js计算两个时间之间天数差的实例代码
Nov 19 Javascript
jQuery获得子元素个数的方法
Apr 14 Javascript
jQuery实现的漂亮表单效果代码
Aug 18 Javascript
Javascript数组Array基础介绍
Mar 13 Javascript
Zabbix添加Node.js监控的方法
Oct 20 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
Sep 22 Javascript
微信小程序实现两个页面传值的方法分析
Dec 11 Javascript
vue实现移动端input上传视频、音频
Aug 18 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
支付宝接口开发集成支付环境小结
2015/03/17 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
php正则preg_replace_callback函数用法实例
2015/06/01 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
用JavaScript计算在UTF-8下存储字符串占用字节数
2013/08/08 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
2015/11/29 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
2016/06/12 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
Javascript for in的缺陷总结
2017/02/03 Javascript
关于TypeScript中import JSON的正确姿势详解
2017/07/25 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
nodejs开发一个最简单的web服务器实例讲解
2020/01/02 NodeJs
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
python用于url解码和中文解析的小脚本(python url decoder)
2013/08/11 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
解决matplotlib库show()方法不显示图片的问题
2018/05/24 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
2018/10/30 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
解决Django一个表单对应多个按钮的问题
2019/07/18 Python
详解使用python爬取抖音app视频(appium可以操控手机)
2021/01/26 Python
Currentbody澳大利亚:美容仪专家
2019/11/11 全球购物
小学校长先进事迹材料
2014/05/13 职场文书
环保倡议书格式范文
2014/05/14 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
敬业奉献模范事迹材料
2014/12/24 职场文书
2015年度保密工作总结
2015/04/24 职场文书
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server