【问题标题】:Extjs get all store recordsextjs 获取所有店铺记录
【发布时间】:2013-09-10 13:45:43
【问题描述】:

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

【问题讨论】:

    标签: javascript extjs filter store


    【解决方案1】:

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

    分机 5 getUnfiltered 方法

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

    分机 4

    (原答案)

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

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

    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
    

    【讨论】:

    • 我不明白为什么 Sencha 很难在商店中放置一个 getAllRecords() 方法。这似乎不直观
    • 是的...我认为这是他们试图通过在 Ext 5 中添加连锁店来解决的问题。
    • 我建议使用store.query(),因为这是一个公开且有文档记录的 API,而快照不是。
    • @Alexander 它是......当它存在的时候。我已经更新了更新版本的答案。感谢您的通知。
    【解决方案2】:

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

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

    【讨论】:

    • getUnfiltered() 在 Ext 6.x 中不可用
    【解决方案3】:

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

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

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

    【讨论】:

    • 在 6.0.2 中,我只使用: var recs = store.getRange();
    • store.getRange(); 仅返回过滤记录
    • 警告:这仅在商店当前被过滤时才有效。否则,它会生成一个 TypeError。
    【解决方案4】:

    在最新的 Extjs 6.2.0 中可以使用

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

    【讨论】:

    • 警告:如果存储被过滤,getSource() 将返回 null。不要使用这个。
    【解决方案5】:

    如果您只想从 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();
    

    【讨论】:

      【解决方案6】:

      对于带有 JSON TreeStore 的 ExtJS 4.2.1(是的,我知道它很旧)的情况,我不得不使用:store.proxy.reader.jsonData,因为 store.snapshotstore.datastore.querystore.queryBy 没有存在。

      【讨论】:

        猜你喜欢
        • 2017-02-24
        • 2012-12-21
        • 1970-01-01
        • 2020-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-13
        • 1970-01-01
        相关资源
        最近更新 更多