我目前正在尝试编写自定义的余烬数据适配器,以便与我的后端一起使用,我遇到了一个问题,我似乎无法找到解决方案。
我正在使用 ember-cli 0.2.7 ember-data 1.0.0-beta.17
我的适配器扩展了现有的RESTAdapter,并按照ember-data I的作者的意图扩展 1.序列化快照 2.将其发送到我的服务器 3.接收来自服务器的回复,现在包括设置为服务器端的id 4.使用规范化的有效负载来解决承诺
因此:
createRecord: function(store, type, snapshot) {
var ws = this.get('ws');
var data = this.serialize(snapshot, {includeId: false});
return new Ember.RSVP.Promise(function(resolve, reject) {
var route = type.typeKey;
ws.create(route, data,
function(context, data) {
try {
var resdata = store.normalize(route, data);
resolve(resdata);
} catch(err) {
console.error(err);
}
},
function(context, data) {
console.log(data);
reject(data);
}
);
});
}
正在解析的规范化有效负载如下所示:
{
name: "Some name",
id: 115,
reference: "Some reference"
}
问题在于解析不会更新商店中的当前记录,而是创建一个全新的记录。结果是我最终得到了两条相同的记录:一条记录对应于后端,另一条记录的ID设置为空。
我试过打电话
store.updateId(snapshot.record, {id: resdata.id});
从适配器,这将使用正确的ID更新记录,但会抛出错误并使记录处于脏状态。另外,我不认为updateId方法是从适配器调用的,但我不确定,也许其他一些人对此有更多的了解?
更新商店中记录的ID的正确方法是什么?任何可以帮助我解决这个问题的建议都受到高度赞赏。
答案 0 :(得分:0)
我遇到了类似的问题。我没有看到重复的记录,只有保存时的错误。看完他们的源代码后,我们需要在snapshot._internalModel而不是.record上调用updateId。所以,
store.updateId(snapshot._internalModel, {id: resdata.id});
相当于解决了我遇到的问题。
希望这至少可以帮助您解决问题。
我使用Ember Data 1.13.9运行Ember 1.13.8。
答案 1 :(得分:0)
事实证明问题与我的自定义适配器无关,而是我在序列化程序中返回了不正确的有效负载(也是自定义的)。我以一个非常直接的“createRecord”方法结束,看起来像:
createRecord: function(store, type, snapshot) {
var ws = this.ws();
var data = this.serialize(snapshot, {includeId: false});
return new Ember.RSVP.Promise(function(resolve, reject) {
var route = type.modelName;
ws.create(route, data,
function(context, data) {
Ember.run(null, resolve, data);
},
function(context, data) {
console.error(data);
Ember.run(null, reject, data);
}
);
});
},