深入浅析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面向对象编程
Mar 02 Javascript
js 调用父窗口的具体实现代码
Jul 15 Javascript
浮动的div自适应居中显示的js代码
Dec 23 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
Jan 14 Javascript
CSS+JS实现点击文字弹出定时自动关闭DIV层菜单的方法
May 12 Javascript
简单的jQuery入门指引
Jul 28 Javascript
Jquery获取radio选中值实例总结
Jan 17 jQuery
浅谈js闭包理解
Apr 01 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
Oct 26 Javascript
js数组中去除重复值的几种方法
Aug 03 Javascript
Vue跨域请求问题解决方案过程解析
Aug 07 Javascript
vue实现简单加法计算器
Oct 22 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
smarty中先strip_tags过滤html标签后truncate截取文章运用
2010/10/25 PHP
ecshop 批量上传(加入自定义属性)
2012/03/20 PHP
php实现在线通讯录功能(附源码)
2016/05/13 PHP
php+js实现百度地图多点标注的方法
2016/11/30 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
javascript 中__proto__和prototype详解
2014/11/25 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
2015/12/18 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
bootstrap suggest下拉框使用详解
2017/04/10 Javascript
JavaScript中双向数据绑定详解
2017/05/03 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
利用jQuery实现简单的拖曳效果实例代码
2017/10/20 jQuery
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
Vue中使用sass实现换肤功能
2018/09/07 Javascript
linux服务器快速卸载安装node环境(简单上手)
2021/02/22 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
2019/07/26 Python
Python编写打字训练小程序
2019/09/26 Python
python中必要的名词解释
2019/11/20 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
2021/03/03 Python
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
美国在线宠物用品商店:Entirely Pets
2017/01/01 全球购物
2014的自我评价
2014/01/13 职场文书
公司授权委托书范本
2014/04/03 职场文书
安全生产责任书范本
2014/04/15 职场文书
希特勒的演讲稿
2014/05/23 职场文书
车间安全生产标语
2014/06/06 职场文书
迎新晚会策划方案
2014/06/13 职场文书
2014年标准化工作总结
2014/12/17 职场文书
《观潮》教学反思
2016/02/17 职场文书