深入浅析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性能优化笔记搜索整理
Aug 21 Javascript
扒一扒JavaScript 预解释
Jan 28 Javascript
javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
Apr 10 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
Apr 17 Javascript
AngularJs Forms详解及简单示例
Sep 01 Javascript
微信小程序使用第三方库Underscore.js步骤详解
Sep 27 Javascript
利用Jasmine对Angular进行单元测试的方法详解
Jun 12 Javascript
使用Dropzone.js上传的示例代码
Oct 10 Javascript
原生js实现公告滚动效果
Jan 10 Javascript
vue中的v-if和v-show的区别详解
Sep 01 Javascript
js简单的分页器插件代码实例
Sep 11 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
Apr 09 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/19 PHP
php smarty truncate UTF8乱码问题解决办法
2014/06/13 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
Laravel 自动生成验证的实例讲解:login / logout
2019/10/14 PHP
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
jquery实现全选、反选、获得所有选中的checkbox
2020/09/13 Javascript
js自定义select下拉框美化特效
2016/05/12 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
jQuery实现搜索页面关键字的功能
2017/02/16 Javascript
Angular动态添加、删除输入框并计算值实例代码
2017/03/29 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
python内存管理机制原理详解
2019/08/12 Python
浅谈Python描述数据结构之KMP篇
2020/09/06 Python
Python常用扩展插件使用教程解析
2020/11/02 Python
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
参观考察邀请函范文
2014/01/29 职场文书
签约仪式主持词
2014/03/19 职场文书
小学毕业典礼主持词
2014/03/27 职场文书
小学六年级学生评语
2014/04/22 职场文书
歌唱比赛策划方案
2014/06/06 职场文书
欢迎横幅标语
2014/06/17 职场文书
专科生就业求职信
2014/06/22 职场文书
庆国庆活动总结
2014/08/28 职场文书
电力培训心得体会
2014/09/02 职场文书
党的群众路线教育实践活动对照检查材料思想汇报(党员篇)
2014/09/25 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
摘录式读书笔记
2015/07/01 职场文书
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python
Go 内联优化让程序员爱不释手
2022/06/21 Golang