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 相关文章推荐
JS文本框不能输入空格验证方法
Mar 19 Javascript
JavaScript原生对象之Number对象的属性和方法详解
Mar 13 Javascript
JavaScript中调用函数的4种方式代码实例
Jul 08 Javascript
小白谈谈对JS原型链的理解
May 03 Javascript
Markdown+Bootstrap图片自适应属性详解
May 21 Javascript
写jQuery插件时的注意点
Feb 20 Javascript
限时抢购-倒计时的完整实例(分享)
Sep 17 Javascript
Nuxt.js踩坑总结分享
Jan 18 Javascript
详解Angular调试技巧之报错404(not found)
Jan 31 Javascript
微信小程序实现图片选择并预览功能
Jul 25 Javascript
在vue中高德地图引入和轨迹的绘制的实现
Oct 11 Javascript
js实现自定义滚动条的示例
Oct 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
解析如何去掉CodeIgniter URL中的index.php
2013/06/25 PHP
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
2015/02/14 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
php探针不显示内存解决方法
2019/09/17 PHP
Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据
2010/03/15 Javascript
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
JavaScript计算两个日期时间段内日期的方法
2015/03/16 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
2016/09/21 Javascript
Vue插件写、用详解(附demo)
2017/03/20 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
Js经典案例的实例代码
2018/05/10 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
如何利用vue+vue-router+elementUI实现简易通讯录
2019/05/13 Javascript
微信小程序开发摇一摇功能
2019/11/22 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
2019/12/20 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
Python求解平方根的方法
2015/03/11 Python
python中异常报错处理方法汇总
2016/11/20 Python
浅谈利用numpy对矩阵进行归一化处理的方法
2018/07/11 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
python asyncio 协程库的使用
2021/01/21 Python
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
Hotels.com印度:酒店预订
2019/05/11 全球购物
Farfetch澳大利亚官网:Farfetch Australia
2020/04/26 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
财务出纳员岗位职责
2013/11/26 职场文书
小学红领巾中秋节广播稿
2014/01/13 职场文书
销售个人求职信范文
2014/04/28 职场文书
给老师的保证书怎么写
2015/05/09 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS
Python字符串格式化方式
2022/04/07 Python
错误码NET::ERR_CERT_DATE_INVALID证书已过期解决方法?
2022/07/07 数码科技