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

标签 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);
    },

});

然后我使用 {{input type="text"value=model.serviceId ... }} 将该模型的属性绑定(bind)到路由模板,效果很好,模型在我填充时填充填写表格。

然后我保存记录:

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

这也行。

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

enter image description here

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

enter image description here

因此,在后端创建了一个新实例,而不是更新现有实例。

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

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

非常感谢任何帮助!

最佳答案

Ember-Data 中的基本 JSONSerializer 在创建记录时仅在有效负载中包含 id。 See 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;
  }
});

文档中有大量关于序列化自定义的附加信息。

希望对您有所帮助!

关于javascript - Ember Data 没有在 save() 上序列化记录 ID,导致没有 ID 的 PUT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24683275/

相关文章:

javascript - 保存关系的 Ember 数据

symfony 2 REST 和 JS (ember.js) 客户端

ember.js - 如何过滤 hasMany 关系?

ember.js - 从 Ember.Route 中访问参数的正确方法是什么。设置 Controller ?

javascript - 使用 jQuery/JS 将单个 <ul> 拆分为四个单独的 <ul>

javascript - 我写了一些 killer 级的 Javascript。我怎样才能让它轻松地重复使用?

javascript - 通过 chrome 扩展检查 cookie 是否存在

javascript - AngularJS + jQuery 移动版

ember.js - Ember-Data 发出大量请求(而不是 ?ids)

javascript - 使用 FixtureAdapter 时如何使用非 -'id' 字段作为主键?