Ember数据希望我的服务器在每次成功之后都返回完整的对象POST
。但是,我的API仅返回一种包含的元对象id
。当Ember收到此对象时,记录中的现有数据将被删除,除了id
。
因此,例如,当我这样做时:
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();
...服务器响应,如下所示:
{
status: "OK",
updated: "Mon, 13 Jan 2014 19:49:14 GMT",
id: "52d4433a8e3b08444740ea47",
}
当Ember收到此消息时,它将id
使用服务器响应中收到的记录来更新记录的,但由于未包含在响应中,因此它也会删除所有其他数据。如果我在Ember帮助器中检查数据,则如下所示:
{
id: '52d4433a8e3b08444740ea47'
name: undefined,
paths: undefined,
type: undefined,
hash: undefined,
datecreated: undefined,
datemodified: undefined,
thumbnail: undefined
}
如何覆盖此行为并让Ember停止删除我的数据?
我看了看:
createRecord
的DS.RESTAdapter
,但它返回一个承诺,所以我不能提取新的id
呢。extractSave
的DS.RESTSerializer
,但它预计store
,type
和payload
作为输入,而不是个人record
!如果记录传递到这里,我可以id
用有效载荷中的内容更新它并解决我的问题。有什么我想念的吗?
看起来记录中的现有数据正在记录的adapterDidCommit
方法中被覆盖。
参见https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/model.js#L656-L657
一种解决方案是扩展该方法以保留记录中的现有数据。我相信它可能看起来像这样。
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
该类,但是我没有看到扩展适配器或序列化器类以实现类似结果的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句