19

我有一个问题。将过滤器添加到存储时,是否可以获取加载到存储中的所有记录?例如,如果我将 34 条记录加载到存储中,然后应用过滤器并且只剩下 15 条,我可以在不清除过滤器的情况下获得这 34 条记录吗?

4

6 回答 6

36

编辑:这最初是为 Ext 4.2 回答的,它snapshot是公开的并记录在案的。如今它已经消失了。所以这里是 Ext 5 和 6 的更新。

分机 5 / 6

一个班轮:

var allRecords = (store.getData().getSource() || store.getData()).getRange();

分解:

var data = store.getData();
// get unfiltered collection (will be null if the store has never been filtered)
var snapshot = data.getSource();
// pick the one that exists
var unfilteredCollection = snapshot || data;
// get items in an array
var allRecords = unfilteredCollection.getRange();

Store#getData为您提供商店的收藏。

Collection#getSource为您提供商店的“来源”,即未过滤的集合——但前提是该集合已被过滤,否则返回null.

在这两种情况下,您都会得到一个Ext.util.Collection. 用于getRange获取实际的项目数组。

分机 5getUnfiltered方法

在 Ext 5 中的某个时候引入了一种getUnfiltered方法(据我所知是 5.0.1,但 Ext 5 的文档目前处于离线状态......)。它在 Ext 5 的第一个版本中不存在,并且在 Ext 6 中消失了。所以,好吧......不要使用它!除非您想无缘无故地将您的代码绑定到 Ext 5,否则请使用上述方法。

分机 4

(原答案)

整个加载的数据集存储在snapshotstore 的属性中。

它仅在需要时创建。这意味着在将某些过滤器应用于商店之前,该属性将不可用。因此,要以安全的方式获取您想要的信息,请使用:

var allRecords = store.snapshot || store.data;

分机 4 / 5 / 6

(可能还有未来的版本)

您可以使用queryqueryBy

这似乎是更向前兼容的方法,因为与以前的方法相反,此 API 没有跨版本更改。

不幸的是,这将遍历集合并产生额外的处理成本......根据您的集合的大小,这可能会或可能不会忽略不计。

var allRecords = store
  .queryBy(function() { return true; }) // returns a collection
  .getRange(); // returns array of items
于 2013-09-06T12:50:56.080 回答
6

也许更向前兼容的方法(即 ExtJS 版本 >= 5)如下:

var allRecords = store.getData().getSource().getRange();

根据文档,这应该适用于 >= 5.0 的版本。

于 2015-07-09T15:52:46.663 回答
4

要从加载的商店中获取所有未过滤的数据,您可以尝试 var records = store.getUnfiltered();

注意:我使用的是 Ext Js 5.1。不确定早期版本。

于 2015-06-16T11:04:12.460 回答
2

如果您只想从 http 响应中获取原始记录 - 这是我的解决方案:

getRawRecords函数添加到store类:

    Ext.override(Ext.data.Store, {
        getRawRecords: function(){
            return Ext.Array.map(this.getData().getRange(), function(record){
                return record.data;
            });
        }
    });

用法:

    var rawData = store.getRawRecords();
于 2018-04-17T12:35:03.197 回答
0

对于带有 JSON TreeStore 的 ExtJS 4.2.1(是的,我知道它很旧)的情况,我不得不使用:store.proxy.reader.jsonDatasince store.snapshot, store.data, store.queryor store.queryBydidn't exist。

于 2019-01-24T11:41:53.290 回答
-1

在最新的 Extjs 6.2.0 中,您可以使用

var allRecs = Store.getData().getSource().items
于 2017-04-26T14:12:50.430 回答