1

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

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

我知道它们是在 Ember Transaction 的提交函数中实例化的(它调用 Adapter's commit,然后调用 Adapter's save)。在整个过程中,我无法确定根据创建/更新/删除标准对记录进行排序的确切位置。

4

1 回答 1

3

我不太清楚你在问什么,但如果你正在寻找将记录添加到适当commitDetails集合的位置,我相信就是你正在寻找的行,在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)

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

[get(record, 'dirtyType')]

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

.add(record);

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

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

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

于 2013-07-13T02:03:02.650 回答