前提:我的问题是基于我对 Ember 数据的研究,这可能正确也可能不正确。所以如果我有任何误解,请纠正我。这些示例使用截至 2013 年 7 月 2 日的最新 ember 运行。
要编辑我的模型的记录,只需 1 条记录,您需要调用this.get('store').commit()
或this.get('model').save()
。然而,这些函数的下游实际上必须更新模型的所有记录,即使是那些未被触及的记录。所以这是非常低效的,特别是如果模型有很多记录。
当我保存对一条记录的编辑时,更新一条且仅一条记录的最佳方法是什么?
更新:这个问题只发生在local-storage-adapter上,而不是RESTAdapter 上。
更新#2:我确实有一个巨大的误解。一切正常, save() 和 commit() 都只更新了 1 条记录,我被本地存储适配器_saveData
的JSON.stringify(this._data)愚弄了,它打印出了所有记录。我假设它打印出来的都是被改变的数据,但在_saveData
's 的调用者中records
,updateRecords和_didSaveRecords只是我正在改变的单个记录。以下关于包含“模型的所有记录”的不同对象的陈述不能再重复。我想我误读了调试信息。
这是有道理的,因为_saveData
使用 localstorage,目前只能为整个对象 setItem,在我的例子中是包含所有记录的模型。由于 localstorage 无法更新该对象的单个条目,因此 JSON 必须包含所有记录。
细节:
运行示例:
this.get('store').commit()
用于更新此 jsbin 的doneEditing
帖子。this.get('model').save()
用于更新 todo 这个jsbinacceptChanges
。
如果你打开 Chrome 调试并进入上面的两个函数,你会看到类似下面的东西:
下游有
currentTransaction
ordefaultTransaction
,里面都有模型的所有记录。在 get('store').commit() 的情况下,它最终会调用 DS.Store's
commit
,后者又会调用:(参见github)get(this, 'defaultTransaction').commit();
在 get('model').save() 的情况下,它最终调用 DS.Store 的
scheduleSave
andflushSavedRecords
,它调用:(参见github)get(this, 'currentTransaction').add(record); get(this, 'currentTransaction').commit();
注意最后 a
commit()
是在 xxxTransaction 上调用的,这是 DS.Transaction 的commit()
。DS.Transaction
s
commit()has a
commitDetails, which is based on xxxTransaction, so
commitDetails`也有数据的所有记录。( github )然后调用 DS.Adapter 的
commit
andsave
并且确实更新了每条记录(github):this.groupByType(commitDetails.updated).forEach(function(type, set) { this.updateRecords(store, type, filter(set)); }, this);
(次要注释/问题:commitDetails 何时设置为“更新”?)
我知道 DS.Adapter 可以自定义,但显然保存多个数据(即所有模型条目)的问题是从 DS.StorecommitDefaultTransaction
和currentTransaction
.
不知何故,我觉得修补 DS.Store 或 DS.Adapter 上游的任何东西都是一个坏主意,比如制作我自己的 save() 和 commit() 版本。基本上我不愿意定制我被告知不要的任何东西,因为可能会有难看的副作用。
那么,如果我想使用 Ember 数据但一次只能更新一条记录,我该怎么办?