当我从服务器收到规范化数据时,我经常需要在商店中获取它。 Ember Data具有语义“推动”:
var thing=normalizedThing
controller.store.push("thing",normalizedThing)
如果我需要更新现有记录,我可以使用更新:
var updatedThing=normalizedUpdatedThing
controller.store.push("thing",normalizedUpdatedThing)
但是,我发现即使记录尚未在商店中加载,更新仍然有效;也就是说,在这种情况下,它会像推动一样。但是,如果记录已存在,则push不会像更新那样。实际上它会抛出一个错误。所以我的问题是,推动的目的是什么?在希望使用规范化数据添加/更新商店时,我是否可以安全地始终调用更新?或者我应该做以下几点?
var thing=normalizedThing
if(controller.store.getById("thing",normalizedThing.get("id")){
controller.store.update("thing",normalizedThing)
}else{
controller.store.push("thing",normalizedThing)
}
答案 0 :(得分:2)
push
的目的是将完整记录加载到商店中,而update
则用于推送部分记录。因此,如果您想要完全替换记录,可能会删除属性,push
非常有用。所以,让我们假设您的商店中有以下记录:
{
"id": 1,
"name": "Bob",
"status": "Going to the movies today!"
}
现在,您还要将以下JSON加载到商店中:
{
"id": 1,
"name": "Bob"
}
如果您使用push
,则我们会向没有状态的用户发送电子邮件。如果您使用update
,则该用户将具有与之前相同的状态。您想要哪一个取决于您的使用案例,但同时使用push
和update
会为您提供选项。
对我而言,push
的目的是完全替换记录而不必担心由update
引起的潜在合并冲突。
答案 1 :(得分:0)
查看来源https://github.com/emberjs/data/blob/master/addon/-private/system/store.js#L1680
push =>
_pushInternalModel =>
_load =>
_internalModelForId [This find or creates a model] =>
internal-model#setupData
setupData: function(data) {
var changedKeys = this._changedKeys(data.attributes);
merge(this._data, data.attributes);
this.pushedData();
if (this.record) {
this.record._notifyProperties(changedKeys);
}
this.didInitalizeData();
},
因此它看起来不像push覆盖任何现有数据。看到不再有更新,我猜他们是相同的,并已合并。 http://emberjs.com/api/data/classes/DS.Store.html#method_push