Ember数据推送与更新

时间:2014-11-19 05:17:35

标签: ember.js ember-data

当我从服务器收到规范化数据时,我经常需要在商店中获取它。 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)
}

2 个答案:

答案 0 :(得分:2)

push的目的是将完整记录加载到商店中,而update则用于推送部分记录。因此,如果您想要完全替换记录,可能会删除属性,push非常有用。所以,让我们假设您的商店中有以下记录:

{
    "id": 1,
    "name": "Bob",
    "status": "Going to the movies today!"
}

现在,您还要将以下JSON加载到商店中:

{
    "id": 1,
    "name": "Bob"
}

如果您使用push,则我们会向没有状态的用户发送电子邮件。如果您使用update,则该用户将具有与之前相同的状态。您想要哪一个取决于您的使用案例,但同时使用pushupdate会为您提供选项。

对我而言,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