Extjs获取所有商店记录

时间:2013-09-06 12:39:35

标签: javascript extjs filter store

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

6 个答案:

答案 0 :(得分:29)

编辑:这最初是针对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获取实际的项目数组。

Ext 5 getUnfiltered方法

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

Ext 4

(原始答案)

整个加载的数据集存储在商店的snapshot属性中。

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

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

Ext 4/5/6

(可能还有将来的版本)

您可以使用queryqueryBy

这似乎是更向前兼容的方法,因为与以前的方法相反,此API在各版本之间没有变化。

不幸的是,这将会遍历该系列,并产生额外的处理成本......根据您收藏的尺寸,这可能会或可能不会忽略不计。

var allRecords = store
  .queryBy(function() { return true; }) // returns a collection
  .getRange(); // returns array of items

答案 1 :(得分:5)

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

#toggle1

基于documentaion,这适用于版本> = 5.0。

答案 2 :(得分:4)

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

注意:我正在使用Ext Js 5.1。对早期版本不确定。

答案 3 :(得分: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();

答案 4 :(得分:0)

对于使用JSON TreeStore的ExtJS 4.2.1(是的,我知道它很旧),我必须使用:"8009" to "8010",因为store.proxy.reader.jsonDatastore.snapshot,{{1 }}或store.data不存在。

答案 5 :(得分:-1)

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

var allRecs = Store.getData().getSource().items