1

前提:我的问题是基于我对 Ember 数据的研究,这可能正确也可能不正确。所以如果我有任何误解,请纠正我。这些示例使用截至 2013 年 7 月 2 日的最新 ember 运行。

要编辑我的模型的记录,只需 1 条记录,您需要调用this.get('store').commit()this.get('model').save()。然而,这些函数的下游实际上必须更新模型的所有记录,即使是那些未被触及的记录。所以这是非常低效的,特别是如果模型有很多记录。

当我保存对一条记录的编辑时,更新一条且仅一条记录的最佳方法是什么?

更新:这个问题只发生在local-storage-adapter上,而不是RESTAdapter 上

更新#2:我确实有一个巨大的误解。一切正常, save() 和 commit() 都只更新了 1 条记录,我被本地存储适配器_saveDataJSON.stringify(this._data)愚弄了,它打印出了所有记录。我假设它打印出来的都是被改变的数据,但在_saveData's 的调用者中recordsupdateRecords_didSaveRecords只是我正在改变的单个记录。以下关于包含“模型的所有记录”的不同对象的陈述不能再重复。我想我误读了调试信息。
这是有道理的,因为_saveData使用 localstorage,目前只能为整个对象 setItem,在我的例子中是包含所有记录的模型。由于 localstorage 无法更新该对象的单个条目,因此 JSON 必须包含所有记录。


细节:

运行示例:

如果你打开 Chrome 调试并进入上面的两个函数,你会看到类似下面的东西:

  1. 下游有currentTransactionor defaultTransaction,里面都有模型的所有记录

    在 get('store').commit() 的情况下,它最终会调用 DS.Store's commit,后者又会调用:(参见github

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

    在 get('model').save() 的情况下,它最终调用 DS.Store 的scheduleSaveand flushSavedRecords,它调用:(参见github

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

    注意最后 acommit()是在 xxxTransaction 上调用的,这是 DS.Transaction 的commit()

  2. DS.Transaction scommit() has acommitDetails , which is based on xxxTransaction, socommitDetails`也有数据的所有记录。( github )

  3. 然后调用 DS.Adapter 的commitandsave并且确实更新了每条记录(github):

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

    (次要注释/问题:commitDetails 何时设置为“更新”?)

我知道 DS.Adapter 可以自定义,但显然保存多个数据(即所有模型条目)的问题是从 DS.StorecommitDefaultTransactioncurrentTransaction.

不知何故,我觉得修补 DS.Store 或 DS.Adapter 上游的任何东西都是一个坏主意,比如制作我自己的 save() 和 commit() 版本。基本上我不愿意定制我被告知不要的任何东西,因为可能会有难看的副作用。

那么,如果我想使用 Ember 数据但一次只能更新一条记录,我该怎么办?

4

1 回答 1

1

您可以transaction()使用store. 此交易与defaultTransaction.

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

提交此事务不会影响其他更改。有关更多想法,请参阅此博客文章

于 2013-07-03T05:58:16.777 回答