Ember.js 自定义适配器createRecord方法在存储区中保留空id记录

Ember.js 自定义适配器createRecord方法在存储区中保留空id记录,ember.js,ember-data,adapter,Ember.js,Ember Data,Adapter,我目前正试图编写一个自定义的ember数据适配器来与我的后端一起使用,我遇到了一个似乎无法找到解决方案的问题 我正在使用 ember cli 0.2.7 余烬数据1.0.0-beta.17 我的适配器扩展了现有的RestaAdapter,正如ember data的作者所希望的那样,我正在 1.序列化快照 2.将其发送到我的服务器 3.从服务器接收回复,现在包括服务器端设置的id 4.使用规范化有效负载来解析承诺 因此: createRecord: function(store, type, sn

我目前正试图编写一个自定义的ember数据适配器来与我的后端一起使用,我遇到了一个似乎无法找到解决方案的问题

我正在使用 ember cli 0.2.7 余烬数据1.0.0-beta.17

我的适配器扩展了现有的RestaAdapter,正如ember data的作者所希望的那样,我正在 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,另一条记录的ID设置为null

我试过打电话

store.updateId(snapshot.record, {id: resdata.id});
这将使用正确的ID更新记录,但抛出错误并使记录处于脏状态。另外,我不认为updateId方法是打算从适配器调用的,但我不确定,也许其他人对此了解得更多


更新存储中记录id的正确方法是什么?非常感谢任何能帮助我解决这个问题的建议。

我遇到了类似的问题。不过,我没有看到重复的记录,只有保存时的错误。在查看了他们的源代码之后,我们似乎需要在快照上调用updateId。所以

store.updateId(snapshot._internalModel, {id:  resdata.id});
这相当于修复了我的问题

希望这至少能帮你解决问题


我正在使用Ember数据1.13.9运行Ember 1.13.8。

结果表明,问题毕竟与我的自定义适配器无关,而是在我的序列化程序中返回了不正确的负载(也是自定义的)。我以一个非常直截了当的“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);
            }
        );
    });
},