考虑具有按数字值分组的记录的商店,其出现类似于
0: 40 times
1: 20 times
2: 15 times
3: 3 times
4: once
5: once
7: once
我想自动汇总到群组
0, 1, 2, >=3
一旦记录中的数值发生变化,商店应该更改其分组以适应变化,例如
0: 2 times
1: 3 times
2: 15 times
3 40 times
4: 65 times,
5: 14 times,
6: 6 times,
7: 3 times
9: once
12: once
应自动汇总到
>=1, 2, 3, 4, 5, >=6
ExtJS存储是否支持使用此类组进行动态分组,如果没有,我该如何添加此功能?
答案 0 :(得分:2)
Ext JS不支持您描述的聚合组。但是,可以通过重新配置存储来更改组,因此可以根据初始组大小重新组织组。需要提供一个实现来确定最终组是什么以及每个组中的记录。
实现需要首先了解组的大小。如果服务器可以提供组的大小,以便客户端不必分组两次(首先确定大小,第二次确定聚合组),然后可以使用grouper来确定聚合组以及每个记录。为石斑鱼提供团体规模。
Ext.define('Fiddle.util.Grouper', {
extend: 'Ext.util.Grouper',
config: {
aggregateGroups: null,
groupSizes: null
},
groupFn: function(record) {
return this.getAggregateGroups()[record.get('groupId')];
},
constructor: function(config) {
this.initConfig(config);
this.callParent(arguments);
var aggregateGroups = {};
var groupSizes = this.getGroupSize();
// Given the group sizes, determine what aggregated group each
// initial group is in.
...
this.setAggregateGroups(aggregateGroups /* e.g. {
0: 0,
1: 1,
2: 2,
3: 3,
4: 3,
5: 3,
7: 3
} */);
}
});
如果服务器无法提供组大小,则必须将记录分组两次。最初,商店可以配置groupField,并且记录将在添加时按该字段的值进行分组。然后可以使用Ext.data.Store.getGroups确定组大小,然后由商店使用的石斑鱼使用。
store.add(records);
var groups = Ext.Array.toValueMap(store.getGroups(), 'name');
// Group sizes are accessible with groups[<name>].children.length. Given
// the group sizes, assign an aggregated group to each initial group, and
// then configure a grouper.
...
store.setConfig({
groupField: null,
grouper: {
groupFn: function(record) {
return groups[record.get('groupId')].aggregatedGroupId;
}
}
});