Ember Data没有在save()上序列化记录ID,导致PUT没有id?

Edy*_*rne 3 javascript ember.js ember-data

我有一条创建新记录的路线,如下所示:

App.ServicesNewRoute = Ember.Route.extend({
    model : function() {
        return this.store.createRecord('service');
    },

    setupController: function(controller, model) {
        controller.set('model', model);
    },

});
Run Code Online (Sandbox Code Playgroud)

然后我将该模型的属性绑定到路径的模板,使用{{input type="text" value=model.serviceId ... }}它很好,模型在填充表单时填充.

然后我保存记录:

App.ServicesNewController = Ember.ObjectController.extend({
    actions : {
        saveService : function() {
            this.get('model').save(); // => POST to '/services'
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

哪个也有效.

然后我再次单击保存按钮,现在save方法按预期执行PUT,因为模型有一个id设置(id:102):

在此输入图像描述

但是当我在Dev Tools中查看PUT请求时,我发现id属性未被序列化:

在此输入图像描述

结果,在后端创建了一个新实例,而不是更新现有实例.

请忽略serviceId属性,它只是一个string与记录ID无关的常规属性,应该只是命名id.

我不知道为什么id没有被序列化...我不能在模型上定义一个id属性,因为Ember Data不允许它,它是隐含的.所以我不知道我错过了什么......

任何帮助是极大的赞赏!

ron*_*nco 8

Ember-Data中的基本JSONSerializer在创建记录时仅包含有效负载中的id.请参阅DS.JSONAdapter.serialize docs.

RestAdapter为PUT更新而生成的URL包括路径中的ID.在你的情况下,我相信它会:PUT '/services/102'.

您可以从后端服务中的路径中提取它.或者您应该能够覆盖序列化程序的行为以添加如下所示的ID:

App.ServiceSerializer = DS.JSONSerializer.extend({
  serialize: function(record, options) {
    var json = this._super.apply(this, arguments); // Get default serialization

    json.id = record.id;  // tack on the id

    return json;
  }
});
Run Code Online (Sandbox Code Playgroud)

有关文档中序列化自定义的大量其他信息.

希望有所帮助!