Extjs获取所有存储记录

21

我有一个问题。当将筛选器添加到存储中时,是否可能获取所有已加载到存储中的记录?例如,如果我加载了34条记录到存储中,然后应用了筛选器,只剩下15条记录,那么我是否可以在不清除筛选器的情况下获取这34条记录?

6个回答

41
编辑:这个问题最初是针对Ext 4.2回答的,其中snapshot是公开且有文档记录的。现在已经不存在了。因此,以下是适用于Ext 5和6的更新。

Ext 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 方法可以获取 Store 的集合。

Collection#getSource 方法可以获取 Store 的“source”,即未过滤的集合,但仅在集合已经被过滤时才返回。否则,它会返回null

无论哪种情况,您都将得到一个Ext.util.Collection。使用getRange 方法获取实际的项目数组。

Ext 5 getUnfiltered 方法

一些 Ext 5 版本引入了getUnfiltered 方法(似乎是从 5.0.1 开始,但 Ext 5 的文档目前离线了...)。它在 Ext 5 的早期版本中不存在,并且在 Ext 6 中被删除了。所以... 不要使用它!除非你想毫无理由地将代码绑定到 Ext 5 上,使用上述方法。

Ext 4

(原始回答)

整个加载的数据集存储在 Store 的 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

我不明白为什么Sencha很难在存储器上放置一个getAllRecords()方法。这似乎是不直观的。 - Oliver Watkins
是的...我认为这就是他们试图通过在Ext 5中添加链接存储来解决的问题类型。 - rixo
我建议使用 store.query(),因为它是公共且有文档记录的 API,而快照则不是。 - Alexander
@Alexander 当它存在时,它是...。我已经更新了我的答案以适应新版本。感谢您的通知。 - rixo

6

也许更符合向前兼容的方法(即ExtJS版本>=5)是以下内容:

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

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

1
在6.0.2中,我只需使用:var recs = store.getRange(); - Jess
2
store.getRange(); 仅返回筛选后的记录。 - Guid
1
警告:仅当商店当前被过滤时,此操作才有效。否则,它会生成一个 TypeError。 - Martin Wickman

4
获取已加载存储器中的所有未过滤数据,您可以尝试使用以下代码: var records = store.getUnfiltered();
注意:我正在使用Ext Js 5.1版本,之前的版本不确定。

getUnfiltered() 在 Ext 6.x 中不可用。 - harryBundles

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();

1
对于我使用的 ExtJS 4.2.1(是的,我知道它很老)和 JSON TreeStore 的情况,我必须使用:store.proxy.reader.jsonData,因为 store.snapshotstore.datastore.querystore.queryBy 都不存在。

-1
在最新的Extjs 6.2.0中,您可以使用:
var allRecs = Store.getData().getSource().items

警告:如果存储被过滤,getSource()将返回null。不要使用它。 - Martin Wickman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接