【问题标题】:Ext.data.Store's each() is ignoring filtered recordsExt.data.Store 的 each() 忽略过滤的记录
【发布时间】:2013-10-26 00:14:54
【问题描述】:

我正在使用 Ext.data.Store 的 each()。但是这个方法,当 store 被过滤时,只会循环过滤的记录。即使在商店上应用了过滤器,我们是否还有其他方法或解决方法来循环遍历商店的所有记录。

  var attStore = Ext.getStore("myStore");
        var allRecords = attStore.snapshot || attStore.data;
        allRecords.each(function (record) {
            if (record.data.IsUpdated) {
                record.set('updatedByUser', true);
            }
            else {
                record.set('updatedByUser', false);
            }
             record.commit();
        });

var allRecords = attStore.snapshot || attStore.data;actually 行按预期返回所有记录,但是当我尝试更新该记录(或使用 record.data.property = something 更新该记录中的属性之一)时,该记录没有得到更新。

谢谢

【问题讨论】:

  • 你如何应用过滤器来存储?
  • @Riku:我使用以下代码:storeName.filter('fieldName', value);
  • 如果更新不起作用,你可以试试这个workarround。清除商店过滤器,应用更改,然后再次应用过滤器。在这种情况下,您不需要使用 store.snapshot,store.each 会返回所有记录,我认为它应该可以工作。
  • @Riku:感谢您的快速回复。我知道这种方法是一种解决方法,但我希望 Sencha 是否可以提供一些开箱即用的方法。再次感谢您的帮助。

标签: extjs extjs4.1 extjs-stores


【解决方案1】:

使用这个

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

像这样循环

allRecords.each(function(record) {
    console.log(record);
});

看到这个store snapshot

【讨论】:

  • 我试过你刚刚分享的代码。但即使 allRecords.length 返回 230 条记录,record 也会为空。我还有什么需要做的吗?
  • 对不起,store.snapshot retunrs 混合 util 集合,所以你需要使用这个方法 docs.sencha.com/extjs/4.1.3/#!/api/… 而不是 ext each
  • 你能分享一下使用 Ext.util.MixedCollection.each() 的代码 sn-p
  • 感谢您的回复。我刚刚更新了我的问题。 var allRecords = attStore.snapshot || attStore.data;正在将所有记录归还给我,但我无法更新记录。
  • extjs 5 个商店不再有快照:这种方法不适用于较新的版本。
【解决方案2】:

在 Sencha Touch 2.3 上,我需要执行以下操作来绕过过滤器。

var allRecords = store.queryBy(function(){return true;});

allRecords.each(function(r){
    doStuff();
});

【讨论】:

  • ExtJS 7.2 也适用于我。
【解决方案3】:
//  Here's how you can do that ...

    myStore.each(function(record)  
    {  
      record.fields.each(function(field) 
      { 
        var fieldValue = record.get(field.name);       
      }); 

    // Alternatively... 
    /*     
      for (var rd in record.data) 
      { 
        var fName = rd; 
        var fValue = record.data[rd]; 
      } 
    */ 
    }, this);  

【讨论】:

    【解决方案4】:

    从 Extjs 5 开始使用以下

    Ext.data.Store.each( fn, [scope], [includeOptions] )
    

    store.each(function(record) {
        // ...
    }, scope, {filtered: true});
    

    【讨论】:

    • 这在 Ext JS 5.1 中似乎不起作用。此外,.each 的 API 文档没有提及此类内容。
    • 文档中的错误,5.1.2 又出现了docs.sencha.com/extjs/5.1/5.1.2-apidocs/#!/api/…
    • 那我错了……太棒了!感谢您指出这一点。
    • 这该死的玩笑 - 6.0.1 没有它,而 6.0.2 又有了。我在想他们最近添加了它
    • 早期版本往往有很多错误和不完整。我一般会等到 x.1 版本再升级
    【解决方案5】:

    您可以使用 getStore().getDataSource().each(function (r) {});获取所有数据甚至存储的功能

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 2011-03-21
      • 2017-08-23
      相关资源
      最近更新 更多