2011-12-22 59 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

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