[英]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條記錄,我被本地存儲適配器_saveData
的JSON.stringify(this._data)愚弄了,該輸出了所有記錄。 我以為,不管它打印出來是改變的數據,但在原來_saveData
的來電者的records
在updateRecords和_didSaveRecords只是我改變了單個記錄。 下面關於包含“模型的所有記錄”的不同對象的陳述將不再重復。 我想我誤讀了調試信息。
這是有道理的,因為_saveData
使用localstorage,當前只能為整個對象設置setItem ,在我的情況下,該模型是包含所有記錄的模型。 由於localstorage無法更新該對象的單個條目,因此JSON必須包含所有記錄。
細節:
運行示例:
this.get('store').commit()
用於在完成
doneEditing
此jsbin的doneEditing中使用 。
this.get('model').save()
用於
更新此jsbin的
acceptChanges
中。
如果您打開Chrome調試並進入以上兩個功能,則會看到類似以下內容:
下游有
currentTransaction
或
defaultTransaction
,並且
都在內部具有模型的所有記錄 。
對於get('store')。commit(),它最終會調用DS.Store的
commit
,而
commit
依次調用:(請參閱
github )
get(this, 'defaultTransaction').commit();
在get('model')。save()的情況下,它最終會調用DS.Store的
scheduleSave
和
flushSavedRecords
,它們調用:(請參閱
github )
get(this, 'currentTransaction').add(record); get(this, 'currentTransaction').commit();
請注意,最后在xxxTransaction上調用了
commit()
,這是DS.Transaction的
commit()
。
DS.Transaction
s
commit()
has a
, which is based on xxxTransaction, so
commitDetails也具有數據的所有記錄。
(
github )
然后調用DS.Adapter的
commit
和
save
,實際上每條記錄都會更新(
github ):
this.groupByType(commitDetails.updated).forEach(function(type, set) { this.updateRecords(store, type, filter(set)); }, this);
(次要注意事項/問題:何時將commitDetails設置為“ updated”?)
我知道DS.Adapter可以自定義,但是顯然可以通過DS.Store的
commitDefaultTransaction
和
currentTransaction
設置保存多個數據(即所有模型條目)的
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.