2011-12-22 60 views
5

我有一个Grid Panel,当我离开页面时,我想要检查一下商店中是否有任何商品(或遍历模型/记录)以检查是否有未保存的更改/添加。检查商店(或记录)是否已被编辑?

我最初尝试使用panel.getStore().getNewRecords()来记录新记录,但它返回当前分页的每条记录。panel.getStore().getUpdatedRecords()似乎忽略了记录,尽管网格中的线条在每个单元格中都有小的红色三角形。

那么,任何人都可以建议正确的方法来检查是否有任何新的或更新的记录存储在商店?

回答

16

这可能适合你。

var records = store.getRange(); 

for (var i = 0; i < records.length; i++) { 
    var rec = records[i]; 

    if (rec.dirty == true) { 
     //Save data 
    } 
} 
1

我用这个:

isStoreModified: function(store) 
{ 
    var modifiedRecords = store.getModifiedRecords(); 
    return modifiedRecords && modifiedRecords.length && modifiedRecords.length > 0; 
}, 
+0

TypeError:Object [object Object] has no method'getModifiedRecords' – 2013-09-10 10:52:40

+0

您使用的是什么版本的Ext Js?该函数位于AbstractStore中,我通过搜索Ext Js 4.1.3和4.2.1源代码进行了双重检查。看到这个:http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.data.AbstractStore-method-getModifiedRecords – costa 2013-09-12 19:53:45

0

我根据这关闭的@theboulderer答案。我知道这是一个古老的线索,但我认为它可能对查找此页面的其他人有用。

我正在使用MVC模型,所以请记住。

你所要做的就是将商店传递给该函数,并返回一个布尔值。

用法:

if (this.isDirtyStore(myStore)){ 
    ... 
} 

功能:

isDirtyStore: function(theStore){ 
    var isDirty = false; 

    theStore.each(function(item){ 
     if(item.dirty == true){ 
      isDirty = true; 
     } 
    }); 
    if (!isDirty){ 
     isDirty = (theStore.removed.length > 0); 
    } 
    return isDirty; 
} 
4

您可以使用这样的事情:

如果(。panel.getStore()getModifiedRecords()长度> 0) console.log('store has dirty records'); }

+1

不考虑删除记录... – HDave 2014-10-31 14:55:32

10

为了保持封装的脏检查逻辑,我选择了将isDirty()方法添加到Ext.data.Store对象。我利用了AbstractStore.sync()用来确定商店是否需要同步的逻辑。

Ext.define(null, { 
    override: "Ext.data.Store", 
    isDirty: function() { 
     return (this.getNewRecords().length > 0 || this.getUpdatedRecords().length > 0 || this.getRemovedRecords().length > 0); 
    } 
}); 

我正在使用ExtJS 4.2.1。如果您在致电getNewRecords()时返回所有记录,则应检查是否已在模型上为idProperty设置了值。

+0

辉煌......完美。 – HDave 2014-10-31 14:55:06

1
if (panel.getStore().needsSync) { 
    //store have unsaved changes. 
} 
0

如果你是新来这里覆盖是@jstrickers回答了MVC样式的程序:

创建:

Ext.define('YourFolder.overridefolder.DataStore', { 

    override: "Ext.data.Store", 
    isDirty: function() { 
     return (this.getNewRecords().length > 0 || this.getUpdatedRecords().length > 0 || this.getRemovedRecords().length > 0); 
    } 

}); 

这个文件到相应的文件夹,然后点添加到它在app.js“需要',然后isDirty将可在您的ext.data.store

工程很好,功能将可用是你需要它。