首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果POST响应只包含id,如何将数据保存到Ember存储区?

如果POST响应只包含id,如何将数据保存到Ember存储区?
EN

Stack Overflow用户
提问于 2014-01-13 20:25:47
回答 2查看 970关注 0票数 2

Ember期望我的服务器在每个成功的POST之后返回完整的对象。但是,我的API只返回一种包含id的元对象。当Ember接收到此对象时,除了id之外,记录中的现有数据将被删除。

例如,当我这样做的时候:

代码语言:javascript
复制
var asset = App.Asset.store.createRecord('asset',{name: 'foo.ai',
    paths: ['/path/foo.ai', '/another/path/foo.ai'],
    type: 'ai',
    hash: '1234567890123456789012345678901234567890',
    datecreated: 'Sun, 12 Jan 2014 06:01:48 GMT',
    datemodified: 'Sun, 12 Jan 2014 06:01:48 GMT',
    thumbnail: '/path/to/thumb.jpg'
});

asset.save();

..。服务器响应如下:

代码语言:javascript
复制
{
    status: "OK",
    updated: "Mon, 13 Jan 2014 19:49:14 GMT",
    id: "52d4433a8e3b08444740ea47",
}

当Ember接收到它时,它会用它在服务器响应中接收到的内容更新记录的id,但是它也会删除所有其他数据,因为它不在响应中。如果我在Ember助手中检查我的数据,如下所示:

代码语言:javascript
复制
{   
    id: '52d4433a8e3b08444740ea47'
    name: undefined,
    paths: undefined,
    type: undefined,
    hash: undefined,
    datecreated: undefined,
    datemodified: undefined,
    thumbnail: undefined
}

如何覆盖此行为并让Ember停止删除我的数据?

我看过:

  • 链接到createRecord中的DS.RESTAdapter,但是它返回一个承诺,所以我还不能提取新的id
  • DS.RESTSerializer中链接到DS.RESTSerializer,但它希望storetypepayload作为输入,而不是单个record!如果将记录传递到这里,我可以用负载中的内容更新它的id并解决我的问题。

我遗漏了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-23 22:31:11

看起来,记录上的现有数据正在记录的adapterDidCommit方法中被覆盖。

请参阅https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/model.js#L656-L657

一种解决方案是扩展该方法以保存记录中的现有数据。我想可能是这样的。

代码语言:javascript
复制
DS.Model.reopen({
  adapterDidCommit: function() {
    var oldData = this.toJSON();
    this._super.apply(this, arguments); // calls the original adapterDidCommit method
    var newData = this._data;
    this._data = Ember.merge(oldData, newData);
  }
});

这段代码可能并不理想,因为它修改了DS.Model类,但我没有找到一种方法来扩展适配器或序列化器类来实现类似的结果。

票数 3
EN

Stack Overflow用户

发布于 2014-01-13 20:25:47

不管它有什么价值,我现在用以下方法来解决我的问题:

代码语言:javascript
复制
// Given a vanilla Javascript `data` object that contains your model data
var asset = App.Asset.store.createRecord('asset', data);
asset.save();

// The server response updated `asset` with an `id` but deleted everything
// else, so we copy the `id` to our `data` object and then update the store
data.id = asset.id;
App.Asset.store.update('asset', data);

这个解决方案感觉很烦人,我宁愿第一次就把它做好,而不是每次我需要保存一张唱片的时候跳这个小舞。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21100712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档