我不太清楚你在问什么,但如果你正在寻找将记录添加到适当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
属性时都会重新计算它。