【发布时间】:2013-06-30 16:56:47
【问题描述】:
前提:我的问题是基于我对 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 的调用者中,updateRecords 和_didSaveRecords 中的records 只是我正在更改的单个记录。以下关于包含“模型的所有记录”的不同对象的陈述不能再重复。我想我误读了调试信息。
这是有道理的,因为_saveData 使用localstorage,目前只能setItem for an entire object,在我的例子中是包含所有记录的模型。由于 localstorage 无法更新该对象的单个条目,因此 JSON 必须包含所有记录。
详情:
运行示例:
this.get('store').commit()用于updating a post this jsbin 的doneEditing。this.get('model').save()用于updating a todo this jsbin 的acceptChanges。
如果你打开 Chrome 调试并进入上面两个函数,你会看到类似下面的东西:
-
下游有
currentTransaction或defaultTransaction,里面都有模型的所有记录。在 get('store').commit() 的情况下,它最终会调用 DS.Store 的
commit,而后者又会调用:(参见 github)get(this, 'defaultTransaction').commit();在 get('model').save() 的情况下,它最终调用 DS.Store 的
scheduleSave和flushSavedRecords,它们调用:(参见 github)get(this, 'currentTransaction').add(record); get(this, 'currentTransaction').commit();注意最后一个
commit()在xxxTransaction上被调用,这是DS.Transaction的commit()。 DS.Transaction
scommit()has acommitDetails, which is based on xxxTransaction, socommitDetails`也有数据的所有记录。 (github)-
然后 DS.Adapter 的
commit和save被调用,实际上每条记录都会更新 (github):this.groupByType(commitDetails.updated).forEach(function(type, set) { this.updateRecords(store, type, filter(set)); }, this);(次要注释/问题:commitDetails 何时设置为“更新”?)
我知道 DS.Adapter 可以自定义,但是很明显保存多个数据(即所有模型条目)的问题是从 DS.Store 的commitDefaultTransaction 和currentTransaction 设置的。
不知何故,我觉得修补 DS.Store 或 DS.Adapter 上游的任何东西是个坏主意,比如制作我自己的 save() 和 commit() 版本。基本上我不愿意定制我被告知不要的任何东西,因为可能会产生丑陋的副作用。
如果我想使用 Ember 数据但一次只能更新一条记录,我该怎么办?
【问题讨论】:
标签: ember.js ember-data