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 相关文章推荐
excel操作之Add Data to a Spreadsheet Cell
Jun 12 Javascript
JQuery 浮动导航栏实现代码
Aug 27 Javascript
用jquery ajax获取网站Alexa排名的代码
Dec 12 Javascript
js 字符串转化成数字的代码
Jun 29 Javascript
减少访问DOM的次数提升javascript性能
Feb 24 Javascript
JS实现鼠标单击与双击事件共存
Mar 08 Javascript
原生JS实现LOADING效果
Mar 16 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
Aug 08 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
Sep 18 Javascript
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
Jun 13 Javascript
解决vue 子组件修改父组件传来的props值报错问题
Nov 09 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
Apr 27 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
建站常用13种PHP开源CMS比较
2009/08/23 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
2019/03/18 PHP
一个对于js this关键字的问题
2007/01/09 Javascript
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
纯js实现背景图片切换效果代码
2010/11/14 Javascript
javascript 手动给表增加数据的小例子
2013/07/10 Javascript
json的定义、标准格式及json字符串检验
2014/05/11 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
JavaScript实现单例模式实例分享
2017/12/22 Javascript
js动态设置select下拉菜单的默认选中项实例
2018/08/21 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
高性能web服务器框架Tornado简单实现restful接口及开发实例
2014/07/16 Python
python递归打印某个目录的内容(实例讲解)
2017/08/30 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
2019/03/18 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
美国购买新书和二手书网站:Better World Books
2018/10/31 全球购物
UNIX文件名称有什么规定
2013/03/25 面试题
12月小学生校园广播稿
2014/02/04 职场文书
应届大专生求职信
2014/06/26 职场文书
小学爱国卫生月活动总结
2014/06/30 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
2014年学校领导班子对照检查材料
2014/09/19 职场文书
2015年初中教务处工作总结
2015/07/21 职场文书
小学毕业教师寄语
2019/06/21 职场文书
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL
Python if else条件语句形式详解
2022/03/24 Python
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang