将动态分组添加到商店

时间:2018-01-20 07:23:13

标签: extjs grouping

考虑具有按数字值分组的记录的商店,其出现类似于

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存储是否支持使用此类组进行动态分组,如果没有,我该如何添加此功能?

1 个答案:

答案 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;
      }
   }
});