自定义适配器createRecord方法在存储中留下null id记录

时间:2015-07-06 15:22:48

标签: ember.js ember-data adapter

我目前正在尝试编写自定义的余烬数据适配器,以便与我的后端一起使用,我遇到了一个问题,我似乎无法找到解决方案。

我正在使用 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的正确方法是什么?任何可以帮助我解决这个问题的建议都受到高度赞赏。

2 个答案:

答案 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);
            }
        );
    });
},