Javascript 余烬数据未序列化save()上的记录id,导致PUT没有id?

Javascript 余烬数据未序列化save()上的记录id,导致PUT没有id?,javascript,ember.js,ember-data,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); }, });

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

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…}}
将该模型的属性绑定到路由的模板,这非常有效,在我填写表单时填充模型

然后我保存记录:

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

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

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

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

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

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


非常感谢您的帮助

就我所知,这是一个同步问题。在第一次请求之后,您执行post请求,然后,当您下次单击商店没有足够的时间刷新自己时,它已保存在服务器中。当我创建了一些东西之后(没有任何转换或操作),我立即尝试删除它时,我也遇到了类似的问题——错误出现了,在你的例子中,有一个稍微不同的故事,但来源相同。我认为解决方案是在承诺解析后刷新状态。

在创建记录时,Ember数据中的基本JSONSerializer仅在有效负载中包含id

RestAdapter生成的用于放置更新的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;
  }
});
文档中有大量关于序列化自定义的附加信息

希望有帮助

最初我使用了answer,效果很好。 但当我查看ember data的源代码时,我注意到本机支持此选项。您只需要将includeId选项传递给序列化程序。 示例代码:

App.ApplicationSerializer = DS.RESTSerializer.extend({
    serialize: function(record, options) {
        options = options ? options : {}; // handle the case where options is undefined
        options.includeId = true;
        return this._super.apply(this, [record, options]); // Call the parent serializer
    }
});

这也可以很好地处理自定义主键定义。

问题是我没有点击太快。我实际上是在手动点击,在点击之间等待了很长一段时间。该id在记录上明确设置,但不会序列化。这是一个如此基本的失败(基本上阻止了所有的更新),以至于我无法相信它在Ember中是一个问题。一定是我做错了什么……首先,我认为使用这种模式很奇怪:返回this.store.createRecord('service',{serviceId:123});如果你想有一个空的包装器-没关系,但是你需要显式地输入id-它应该由你的后端生成,并且应该在Ember数据存储中序列化。哦,很抱歉,它只是用于测试目的。:)我也有同样的问题。默认情况下,余烬数据似乎没有将id放入POST和PUT的有效负载中。我要做的是,在我的模型中添加另一个属性作为id,但使用不同的名称,例如我使用postId的post。在save()之前,我分配id:postiD=post.id。Ember仅阻止我们将id添加为模型属性。其他名称很好:Dcheck如果余烬试图将其生成的id发布到后端会怎么样