簡體   English   中英

如何使用Ember-data更新Ember.js中的僅1條記錄? 當前在1條記錄上的save()和commit()實際上更新了模型的所有記錄

[英]How to update just 1 record in Ember.js with Ember-data? Currently save() and commit() on 1 record actually updates all records of model

前提:我的問題是基於對Ember數據的研究得出的,該結論可能正確也可能不正確。 因此,如果我有任何誤解,請糾正我。 截至2013年7月2日,示例使用最新的余燼運行。

要編輯我的模型的記錄(僅1條記錄),您需要調用 this.get('store').commit()this.get('model').save() 但是,這些功能中的任何一個的下游實際上都必須更新模型的 所有記錄,即使是未修改的記錄也是如此。 因此,這效率很低,尤其是在模型具有大量記錄的情況下。

當我保存一條記錄的編輯內容時,更新一條和一條記錄的最佳方法是什么?

更新:此問題僅在 local-storage-adapter而不是 RESTAdapter上發生

更新#2:我確實有很大的誤解。 一切正常,save()和commit() _saveData更新1條記錄,我被本地存儲適配器_saveDataJSON.stringify(this._data)愚弄了,該輸出了所有記錄。 我以為,不管它打印出來是改變的數據,但在原來_saveData的來電者的recordsupdateRecords_didSaveRecords只是我改變了單個記錄。 下面關於包含“模型的所有記錄”的不同對象的陳述將不再重復。 我想我誤讀了調試信息。
這是有道理的,因為_saveData使用localstorage,當前只能為整個對象設置setItem ,在我的情況下,該模型是包含所有記錄的模型。 由於localstorage無法更新該對象的單個條目,因此JSON必須包含所有記錄。


細節:

運行示例:

如果您打開Chrome調試並進入以上兩個功能,則會看到類似以下內容:

  1. 下游有 currentTransactiondefaultTransaction ,並且 都在內部具有模型的所有記錄

    對於get('store')。commit(),它最終會調用DS.Store的 commit ,而 commit依次調用:(請參閱 github

     
       
       
       
        
        
        get(this, 'defaultTransaction').commit();
       
       
        

    在get('model')。save()的情況下,它最終會調用DS.Store的 scheduleSaveflushSavedRecords ,它們調用:(請參閱 github

     
       
       
       
        
        
        get(this, 'currentTransaction').add(record); get(this, 'currentTransaction').commit();
       
       
        

    請注意,最后在xxxTransaction上調用了 commit() ,這是DS.Transaction的 commit()

  2. DS.Transaction s commit() has a , which is based on xxxTransaction, so commitDetails也具有數據的所有記錄。 github

  3. 然后調用DS.Adapter的 commitsave ,實際上每條記錄都會更新( github ):

     
       
       
       
        
        
        this.groupByType(commitDetails.updated).forEach(function(type, set) { this.updateRecords(store, type, filter(set)); }, this);
       
       
        

    (次要注意事項/問題:何時將commitDetails設置為“ updated”?)

我知道DS.Adapter可以自定義,但是顯然可以通過DS.Store的 commitDefaultTransactioncurrentTransaction設置保存多個數據(即所有模型條目)的 commitDefaultTransaction

我覺得以某種方式修改DS.Store或DS.Adapter上游的任何內容都是一個壞主意,例如制作自己的save()和commit()版本。 基本上,我不願意自定義任何不被告知的內容,因為可能會有丑陋的副作用。

因此,如果我想使用Ember數據但一次只能更新一條記錄,該怎么辦?

您可以使用store transaction()方法創建一個僅用於管理該記錄的新事務。 此事務具有與defaultTransaction相同的api。

var transaction = this.get('store').transaction();
transaction.add(model)
transaction.commit();

提交此交易不會影響其他更改。 請參閱此博客文章以獲取更多想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM