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。DS.RESTSerializer中链接到DS.RESTSerializer,但它希望store、type和payload作为输入,而不是单个record!如果将记录传递到这里,我可以用负载中的内容更新它的id并解决我的问题。我遗漏了什么吗?
发布于 2014-01-23 22:31:11
看起来,记录上的现有数据正在记录的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类,但我没有找到一种方法来扩展适配器或序列化器类来实现类似的结果。
发布于 2014-01-13 20:25:47
不管它有什么价值,我现在用以下方法来解决我的问题:
// 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);这个解决方案感觉很烦人,我宁愿第一次就把它做好,而不是每次我需要保存一张唱片的时候跳这个小舞。
https://stackoverflow.com/questions/21100712
复制相似问题