我有一个问题。当将筛选器添加到存储中时,是否可能获取所有已加载到存储中的记录?例如,如果我加载了34条记录到存储中,然后应用了筛选器,只剩下15条记录,那么我是否可以在不清除筛选器的情况下获取这34条记录?
我有一个问题。当将筛选器添加到存储中时,是否可能获取所有已加载到存储中的记录?例如,如果我加载了34条记录到存储中,然后应用了筛选器,只剩下15条记录,那么我是否可以在不清除筛选器的情况下获取这34条记录?
snapshot
是公开且有文档记录的。现在已经不存在了。因此,以下是适用于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
方法获取实际的项目数组。
getUnfiltered
方法一些 Ext 5 版本引入了getUnfiltered
方法(似乎是从 5.0.1 开始,但 Ext 5 的文档目前离线了...)。它在 Ext 5 的早期版本中不存在,并且在 Ext 6 中被删除了。所以... 不要使用它!除非你想毫无理由地将代码绑定到 Ext 5 上,使用上述方法。
(原始回答)
整个加载的数据集存储在 Store 的 snapshot
属性中。
但只有在需要时才会创建它。这意味着在对存储应用某些过滤器之前,该属性将不可用。因此,为了以安全的方式获取所需的信息,请使用:
var allRecords = store.snapshot || store.data;
(还有可能是未来版本)
与先前的方法不同,这个API在各个版本中没有发生过变化,似乎更具前向兼容性。
不幸的是,这将遍历集合并产生额外的处理成本...这可能是可以忽略不计的,也可能取决于您集合的大小。
var allRecords = store
.queryBy(function() { return true; }) // returns a collection
.getRange(); // returns array of items
也许更符合向前兼容的方法(即ExtJS版本>=5)是以下内容:
var allRecords = store.getData().getSource().getRange();
store.getRange();
仅返回筛选后的记录。 - Guid如果您只想从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();
store.proxy.reader.jsonData
,因为 store.snapshot
、store.data
、store.query
或 store.queryBy
都不存在。var allRecs = Store.getData().getSource().items
store.query()
,因为它是公共且有文档记录的 API,而快照则不是。 - Alexander