2013-05-09 86 views
1

我想使用自定义算法过滤Ext商店。 JSON/AJAX代理返回> 100条记录,我需要根据许多条件将数字减少到前5位。如何实现Ext.data.Store的自定义过滤算法

如何去解决这个问题(而不是算法,但在哪里触发它)?

我目前的做法是使用自定义的读者像这样

Ext.define('MyReader', { 
    extend : 'Ext.data.reader.Json', 
    alias : 'reader.myReader', 

    getResponseData : function(response) { 
    var data = this.callParent([response]); 
    // algorithm 
    return filteredData; 
    } 
}); 
Ext.define('SunApp.store.Stations', { 
    extend: 'Ext.data.Store', 
    requires: ['MyReader'], 

    config: { 
    model: 'SunApp.model.Station', 
    autoLoad: true, 
    proxy: { 
     type: 'ajax', 
     url: 'data.json', 
     reader: { 
     type: 'myReader' 
     } 
    } 
    } 
}); 

,但我宁愿立足于商店模式的算法比对原始JSON数据。因此,我想在数据加载到商店时过滤/过滤。请注意,显示的列表视图时,该店隐含分机创建:

Ext.define('SunApp.view.Stations', { 
    extend: 'Ext.List', 
    xtype: 'stations', 

    config: { 
    title: 'Stations', 
    store: 'Stations', 
    ... 

因此,我不能只是增加一个功能,我手动调用它被传递到列表前的商店。

回答

0

在这种情况下,过滤器可能需要遍历存储数据(即记录)几次,以减少全套设置为所需的集合我相信(我仍然是一个Sencha新秀......)以下可以是细:

  • 写有载事件侦听
  • 做魔滤波
  • 呼叫setData在商店经过滤波的数据

因此,而不是在读者过滤它会是这样的:

Ext.define('SunApp.store.Stations', { 
    extend: 'Ext.data.Store', 
    config: { 
    model: ..., 
    sorters: [...], 
    listeners: { 
     load: function(store, records, success, eOpts) { 
     var filteredRecords = filter(records); 
     store.setData(filteredRecords); 
     } 
    }, 
    proxy: ... 
    } 
});