Ember数据提交详细信息创建/更新/删除的有序集是什么?

时间:2013-07-06 04:05:37

标签: ember.js ember-data

Ember Data的适配器将已编辑的记录保存在Ember.OrderedSets的不同组中,即:commitDetails.createdcommitDetails.updatedcommitDetails.deleted

来自模型控制器model.save()

createRecord()将放置在commitDetails.created组中。来自模型控制器model.save()的{​​{1}}将放置在acceptChanges组中。但我找不到放置关联发生的代码。

我知道他们是instantiated in Ember Transaction's提交function(调用适配器的commit,然后调用适配器的save)。在整个过程中,我无法根据创建/更新/删除的标准确定记录的确切位置。

1 个答案:

答案 0 :(得分:3)

我不太清楚你在问什么,但是如果你正在寻找将记录添加到适当的commitDetails集的位置,我相信this就是你要找的那条线for,在commitDetails属性本身。

以下是相关代码。

forEach(records, function(record) {
  if(!get(record, 'isDirty')) return;
  record.send('willCommit');
  var adapter = store.adapterForType(record.constructor);
  commitDetails.get(adapter)[get(record, 'dirtyType')].add(record);
});

让我们一起来看看。

forEach(records, function(record) {
  if(!get(record, 'isDirty')) return;

上面说过,对于交易中的每条记录,如果它不脏,则忽略它。

record.send('willCommit');

否则,将其状态更新为inFlight。

var adapter = store.adapterForType(record.constructor);

获取记录的适配器。

commitDetails.get(adapter)

查找适配器的已创建/更新/删除的三重奏对象,该对象已在此方法here的顶部实例化。它只是一个创建,更新和删除3个属性的对象,其值为空OrderedSets。

[get(record, 'dirtyType')]

从我们刚刚获得的对象中获取适当的OrderedSet。例如,如果我们所处的记录已更新,get(record, 'dirtyType')将返回字符串updated。括号只是标准的JavaScript属性查找,因此它在上一步中从我们的trio对象中获取更新的OrderedSet。

.add(record);

最后,将记录添加到OrderedSet。在循环的后续迭代中,我们将添加相同类型的其他记录,因此所有创建的记录都会添加到一个集合中,所有更新的记录都会添加到另一个集合中,并且所有已删除的记录都会添加到第三个集合中。

我们最终在整个方法结束时返回的属性是一个Map,其键是适配器,其值是这些对象,其中创建,更新和删除了3个属性。反过来,这些中的每一个都是事务中为该适配器创建的所有记录的OrderedSets,为该适配器更新,并分别为该适配器删除。

请注意,此计算属性已标记为volatile,因此每次有人获取commitDetails属性时都会重新计算该属性。