深入浅析Extjs中store分组功能的使用方法


Posted in Javascript onApril 20, 2016

在项目实践的过程中,遇到需要将grid中数据根据某一字段分组的要求,当然,这个功能在api中有,在此列出来以供大家查找:

两点需要注意的地方:

1、在创建store时,需要设置groupField属性的值,即为需要分组的值

for example:

JavaScript代码

Ext.define('Person', { 
extend: 'Ext.data.Model', 
fields: ['name', 'sex'] 
});

在这个数据模型中,我们需要以性别(sex)分组,那么请看下面的store

JavaScript代码

var PersonStore = Ext.create('Ext.data.Store', { 
storeId: 'PersonStore', 
model: 'Person', 
groupField: 'sex', 
data: [{ 
name: 'hongmei li', 
sex: 'female' 
},{ 
name: 'san zhang', 
sex: 'male' 
},{ 
name: 'Jim Green', 
sex: 'male' 
},{ 
name: 'Lily', 
sex: 'female' 
},{ 
name: 'Lucy', 
sex: 'female' 
}] 
});

接下来,我们需要定义分组显示的tpl

JavaScript代码

var groupingFeature= Ext.create('Ext.grid.feature.Grouping',{ 
groupHeaderTpl: 'sex: {name} ({rows.length} Item{[values.rows.length > 1 ? "s" : ""]})' 
});//注意其中{name}即为store中sex列所对应的值

在gridPanel中,代码如下:配置features为上述定义的groupingFeature

JavaScript代码

var grid = Ext.create('Ext.grid.Panel', { 
renderTo: Ext.getBody(), 
store: PersonStore, 
width: 600, 
height: 400, 
title: 'Person', 
features: [groupingFeature], 
columns: [{ 
text: 'Name', 
flex: 1, 
dataIndex: 'name' 
},{ 
text: 'sex', 
flex: 1, 
dataIndex: 'sex' 
}] 
});

效果图如下:

深入浅析Extjs中store分组功能的使用方法 

当然实现分组后,在gridPanel中sex这一列就可以不用显示。

需要注意的是store中的数据如果在变化的时候,分组是不是也可以正常显示呢?

现在给grid增加一个itemclick事件,代码如下:

JavaScript代码

listeners:{ 
itemclick:function(thisview,record){ 
PersonStore.<span style="color:#ff0000;">add</span>([{name:"li",sex:"male"},{name:"zhang",sex:"female"}]); 
} 
}

效果如下图

深入浅析Extjs中store分组功能的使用方法 

可以看出来,界面并不是我们想要的,那么如何解决呢?(最开始愚笨的解决方案是我将此gridPanel移除并销毁掉,重新加载)我将listeners监听事件的代码做了一些变换

JavaScript代码

listeners:{ 
itemclick: function (thisview,record){ 
PersonStore.loadData([{name: "li" ,sex: "male" },{name: "zhang" ,sex: "female" }], true ); 
} 
}

再看效果:

深入浅析Extjs中store分组功能的使用方法 

这个就是我们想要的效果,在动态变化store中的数据时,分组也要实现,而不是将数据追加在gridPanel的最后。对应这两段代码的区分,主要在,store添加数据的方法,前者是add(record),后者是loadData(records,[append])

起初不能理解为什么同样是store添加数据,效果却不一样,看官方文档的解释,add(),The new Model instances will be added at the end of the existing collection.(将数据追加在集合的最后)恍然大悟,loadData是按照store的规则将数据加载进来。

另外,如何移除组中最旧一行,自己动手查了一下,文档实现了,在这里与大家分享:

//将前面的listeners监听事件修改如下:

注意其中first([boolean group])方法,如果不传参数,获取的是store中的第一条数据,传参为true时,返回的是store分组以组名为key,组内第一条数据为value的多个对象,PersonStore.first(true).female获取female组内的第一条数据,想获取male中的,可以使用PersonStore.first(true).male

JavaScript代码

listeners:{ 
itemclick: function (thisview,record){ 
PersonStore.loadData([{name: "li" ,sex: "male" },{name: "zhang" ,sex: "female" }], true ); 
alert(PersonStore.first( true ).female.get( 'name' )); 

console.log(PersonStore.first( true ).female); 
PersonStore.remove(PersonStore.first( true ).female); 
// console.log(PersonStore.getAt(0));
} 
}

为避免removedRecords占用内存,进行了进一步的处理,功能可以实现,但是方法有些笨,大家有好的办法可以交流交流

看代码:

listeners:{ 
itemclick:function(thisview,record){ 
PersonStore.loadData([{name:"li",sex:"male"},{name:"zhang",sex:"female"}],true); 
alert(PersonStore.first(true).female.get('name')); 
console.log(PersonStore.first(true)); 
PersonStore.remove(PersonStore.first(true).female); 
var recs = PersonStore.getRange(); 
console.log(recs); 
//PersonStore.removeAll(true);//这句有没有都可以 
PersonStore.loadRecords(recs);//重新load数据,内存中记录的removed掉的就没有了 
console.log(PersonStore); 
alert(PersonStore.getRemovedRecords.length);//这句alert结果为0 
// console.log(PersonStore.getAt(0)); 
} 
}
Javascript 相关文章推荐
escape、encodeURI、encodeURIComponent等方法的区别比较
Dec 27 Javascript
asp 取文本框名称代码
Dec 02 Javascript
在浏览器中获取当前执行的脚本文件名的代码
Jul 19 Javascript
Javascript中各种trim的实现详细解析
Dec 10 Javascript
Js冒泡事件详解及阻止示例
Mar 21 Javascript
浅谈javascript 函数属性和方法
Jan 21 Javascript
javascript正则表达式定义(语法)总结
Jan 08 Javascript
JavaScript中动态向表格添加数据
Jan 24 Javascript
Angular通过angular-cli来搭建web前端项目的方法
Jul 27 Javascript
javascript 中模板方法单例的实现方法
Oct 17 Javascript
详解AngularJS 过滤器的使用
Jun 02 Javascript
通过cordova将vue项目打包为webapp的方法
Feb 02 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
Apr 20 #Javascript
JavaScript  cookie 跨域访问之广告推广
Apr 20 #Javascript
JavaScript实现简单Tip提示框效果
Apr 20 #Javascript
JS实现消息来时让网页标题闪动效果的方法
Apr 20 #Javascript
javascript实现仿百度图片的瀑布流加载效果
Apr 20 #Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
Apr 19 #Javascript
javascript实现简单计算器效果【推荐】
Apr 19 #Javascript
You might like
PHP开发中常用的字符串操作函数
2011/02/08 PHP
PHP封装的HttpClient类用法实例
2015/06/17 PHP
Yii列表定义与使用分页方法小结(3种方法)
2016/07/15 PHP
浅谈PHP的反射机制
2016/12/15 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
Jquery 常用方法经典总结
2010/01/28 Javascript
range 标准化之获取
2011/08/28 Javascript
javascript 基础篇4 window对象,DOM
2012/03/14 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
Jquery和Js获得元素标签名称的方法总结
2016/10/08 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
Bootstrap jquery.twbsPagination.js动态页码分页实例代码
2017/02/20 Javascript
Angular使用Restful的增删改
2018/12/28 Javascript
Vue配置marked链接添加target=&quot;_blank&quot;的方法
2019/07/19 Javascript
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
python 计算两个日期相差多少个月实例代码
2017/05/24 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
对python当中不在本路径的py文件的引用详解
2018/12/15 Python
Django之无名分组和有名分组的实现
2019/04/16 Python
python 的 scapy库,实现网卡收发包的例子
2019/07/23 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
Python 面向对象部分知识点小结
2020/03/09 Python
Python 实现RSA加解密文本文件
2020/12/30 Python
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
彪马美国官网:PUMA美国
2017/03/09 全球购物
工业自动化专业毕业生推荐信
2013/11/18 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
西安大雁塔导游词
2015/02/10 职场文书
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL