深入浅析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 相关文章推荐
jQuery Study Notes学习笔记 (二)
Aug 04 Javascript
深入理解JavaScript中的传值与传引用
Dec 09 Javascript
js数组的操作指南
Dec 28 Javascript
javascript获取元素离文档各边距离的方法
Feb 13 Javascript
jQuery实现美观的多级动画效果菜单代码
Sep 06 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
May 15 Javascript
详解用webpack把我们的业务模块分开打包的方法
Jul 20 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
Feb 05 Javascript
JavaScript实现的简单加密解密操作示例
Jun 01 Javascript
JS判断数组里是否有重复元素的方法小结
May 21 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
Jun 20 Javascript
微信小程序实现简单购物车功能
Dec 30 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+SqlServer实现分页显示
2006/10/09 PHP
PHP读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
php实现文件预览功能
2017/05/23 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
javascript编程起步(第四课)
2007/02/27 Javascript
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
node.js中的fs.rmdir方法使用说明
2014/12/16 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
JS事件添加和移出的兼容写法示例
2016/06/20 Javascript
angularjs 源码解析之injector
2016/08/22 Javascript
Angular2 多级注入器详解及实例
2016/10/30 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
2018/01/08 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
[02:44]重置世界,颠覆未来——DOTA2 7.23版本震撼上线
2019/12/01 DOTA
Python Queue模块详解
2014/11/30 Python
python 写入csv乱码问题解决方法
2016/10/23 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
2018/09/13 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
2018/11/16 Python
Django实现CAS+OAuth2的方法示例
2019/10/30 Python
python 实现list或string按指定分段
2019/12/25 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
Pytorch 卷积中的 Input Shape用法
2020/06/29 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
预备党员思想汇报
2014/01/08 职场文书
学校文明单位申报材料
2014/05/06 职场文书
纪检干部先进事迹材料
2014/08/23 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis