Ember Data的适配器将已编辑的记录保存在Ember.OrderedSets
的不同组中,即:commitDetails.created,commitDetails.updated和commitDetails.deleted。
model.save()
的 createRecord()
将放置在commitDetails.created
组中。来自模型控制器model.save()
的{{1}}将放置在acceptChanges
组中。但我找不到放置关联发生的代码。
我知道他们是instantiated in Ember Transaction's提交function(调用适配器的commit
,然后调用适配器的save
)。在整个过程中,我无法根据创建/更新/删除的标准确定记录的确切位置。
答案 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
属性时都会重新计算该属性。