[英]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.