深入浅析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 相关文章推荐
js鼠标滑过弹出层的定位IE6bug解决办法
Dec 26 Javascript
javascript中RegExp保留小数点后几位数的方法分享
Aug 13 Javascript
js实现字符串的16进制编码不加密
Apr 25 Javascript
JS 实现列表与多选框选择附预览动画
Oct 29 Javascript
在JavaScript中正确引用bind方法的应用
May 11 Javascript
jQuery判断一个元素是否可见的方法
Jun 05 Javascript
浅谈javascript原型链与继承
Jul 13 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
Apr 26 Javascript
如何使用headjs来管理和异步加载js
Nov 29 Javascript
canvas 弹幕效果(实例分享)
Jan 11 Javascript
Angular实现搜索框及价格上下限功能
Jan 19 Javascript
使用vue开发移动端管理后台的注意事项
Mar 07 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中ADODB类详解
2008/03/25 PHP
php 批量替换html标签的实例代码
2013/11/26 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
火狐浏览器(firefox)下获得Event对象以及keyCode
2008/11/13 Javascript
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
ext前台接收action传过来的json数据示例
2014/06/17 Javascript
cookie的secure属性详解
2015/04/08 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
JavaScript实现水平进度条拖拽效果
2017/01/18 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
Python将xml和xsl转换为html的方法
2015/03/10 Python
Python中用于计算对数的log()方法
2015/05/15 Python
python清除字符串里非数字字符的方法
2015/07/02 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
Django中redis的使用方法(包括安装、配置、启动)
2018/02/21 Python
python实现树形打印目录结构
2018/03/29 Python
django进阶之cookie和session的使用示例
2018/08/17 Python
TensorFlow的reshape操作 tf.reshape的实现
2020/04/19 Python
python集合能干吗
2020/07/19 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
Python实现扫码工具的示例代码
2020/10/09 Python
BNKR中国官网:带你感受澳洲领先潮流时尚
2018/08/21 全球购物
人力资源主管职责范本
2014/03/05 职场文书
铲车司机岗位职责
2014/03/15 职场文书
补充协议书范本
2014/04/23 职场文书
工作岗位说明书模板
2014/05/09 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
学生检讨书怎么写
2014/10/09 职场文书
前台接待岗位职责
2015/02/03 职场文书