Extjs获取所有商店记录

kul*_*rim 17 javascript extjs store filter

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

rix*_*ixo 31

编辑:这最初是针对Ext 4.2的,其中包括snapshot公开和记录.它现在已经消失了.这是Ext 5和6的更新.

分机5/6

一个班轮:

var allRecords = (store.getData().getSource() || store.getData()).getRange();
Run Code Online (Sandbox Code Playgroud)

分解:

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();
Run Code Online (Sandbox Code Playgroud)

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

Collection#getSource为您提供商店的"来源",即未过滤的集合 - 但仅在集合已经过滤后才返回,否则返回null.

在这两种情况下,你都会得到一个Ext.util.Collection.使用getRange来获得项目的实际阵列.

Ext 5 getUnfiltered方法

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

Ext 4

(原始答案)

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

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

var allRecords = store.snapshot || store.data;
Run Code Online (Sandbox Code Playgroud)

分机4/5/6

(可能是未来的版本)

你可以使用queryqueryBy.

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

不幸的是,这将导致收集并产生额外的处理成本......根据您的收藏大小,这可能会或可能不会被忽略.

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


小智 5

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

var allRecords = store.getData().getSource().getRange();
Run Code Online (Sandbox Code Playgroud)

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

  • `store.getRange();`只返回过滤后的记录 (2认同)