深入浅析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 相关文章推荐
浅谈javascript的数据类型检测
Jul 10 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
Oct 24 Javascript
JS去除右边逗号的简单方法
Jul 03 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
Aug 01 Javascript
js中直接声明一个对象的方法
Aug 10 Javascript
jQuery unbind 删除绑定事件详解
May 24 Javascript
jquery实现自定义图片裁剪功能【推荐】
Mar 08 Javascript
jquery插件ContextMenu设置右键菜单
Mar 13 Javascript
javascript的delete运算符知识点总结
Nov 19 Javascript
KnockoutJS数组比较算法实例详解
Nov 25 Javascript
javascript实现点击星星小游戏
Dec 24 Javascript
让JavaScript代码更加精简的方法技巧
Jun 01 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堆排序(heapsort)练习
2013/11/13 PHP
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
javascript 函数调用规则
2009/08/26 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
2016/09/18 Javascript
JS中对数组元素进行增删改移的方法总结
2016/12/15 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
2017/08/23 Javascript
Angular中的$watch方法详解
2017/09/18 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
Vue.js获取被选择的option的value和text值方法
2018/08/24 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
python使用opencv对图像mask处理的方法
2019/07/05 Python
python实现随机加减法生成器
2020/02/24 Python
python程序文件扩展名知识点详解
2020/02/27 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
ivx平台开发之不用代码实现一个九宫格抽奖功能
2021/01/27 HTML / CSS
LUISAVIAROMA中国官网:时尚奢侈品牌购物网站
2020/11/01 全球购物
Yahoo-PHP面试题4
2012/05/05 面试题
2015年敬老院工作总结
2015/05/18 职场文书
退伍军人感言
2015/08/01 职场文书
导游词之井冈山
2019/11/20 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL