烬数据没有为新实例创建id

Ember Data not creating an id for new instances

本文关键字:实例 创建 id 新实例 数据      更新时间:2023-09-26

我使用本地存储适配器创建了一个Ember应用程序的原型。

我现在试图将应用程序转换为使用带有后端存储的Ember Data REST适配器。

在应用程序的本地存储版本中,Ember在保存新记录之前生成一个id(即使该记录从未保存)。

例如,在我的本地存储应用程序中,我可以在两个地方记录id

var gecko = this.store.createRecord('gecko', {
    date: new Date(),
    type: "gecko",                                     
    });
  console.log(gecko.id, "gecko.id before save");
  gecko.save();
  console.log(gecko.id, "gecko.id");

相比之下,在我使用后端存储的REST适配器制作的应用程序版本中,id没有记录。

当我检查Ember发送到服务器的数据时,没有包含id(可能是因为从未生成id)。

这是json烬发送到我的服务器

  gecko: { type: "alloc", date: "2015-05-30T13:28:27.539Z"}

我假设我应该保存Ember在我的服务器上生成的id(这当然允许它通过id检索记录,如果我的服务器实现了这一点)。

问题:为什么没有生成id ?

这是代码

    App = Ember.Application.create();
    App.Router.map(function() {
      this.route("gecko", { path: "/" });
    });
    App.ApplicationAdapter = DS.RESTAdapter.extend({
    //haven't actually any created any code for this part yet
    });
    App.ApplicationStore = DS.Store.extend({
      adapter: App.ApplicationAdapter.create() 
    });
    App.Gecko = DS.Model.extend({
      type: DS.attr('string'),
      date: DS.attr('date')
    })
    App.GeckoRoute = Ember.Route.extend({
      model: function() {
       //currently does nothing. originally I tried to do `return this.store.find('gecko') but since there are no records yet on the backend, it's returning null which leads to an error which Array cannot map over
      },
    });
App.GeckoController = Ember.Controller.extend({
  actions: {
       createGeckoButtonClicked: function(){
            var gecko = this.store.createRecord('gecko', {
                date: new Date(),
                type: "gecko",                                     
            });
            console.log(gecko.id, "gecko.id before save"); //null
            gecko.save();
            console.log(gecko.id, "gecko.id"); //null
       }

  }

注:我不确定它是否相关,但我觉得我在一个鸡/蛋的情况下与路线,因为我不能返回任何条目之前,我已经创建了他们。

因此,我试图设置Ember应用程序,以便能够将条目POST到服务器,然后我将实现使用return this.store.find('gecko')检索它的路由。

当您使用RESTAdapter并保存模型时,ember-data期望得到一个有效的有效负载,该有效负载包含由后端生成的唯一id。

var gecko = this.store.createRecord('gecko', {
    date: new Date(),
    type: "gecko",                                     
});
/*
   Here ember-data expects a payload like this:
        gecko: {id: 1, date: "", type: "gecko"}
   The id is generated by your backend
*/
gecko.save().then(function(gecko){
    console.log(gecko.get('id'))
})

Ember Data不创建id,没有任何东西可以阻止它生成非唯一id。当涉及到gecko记录时,它不是事实的来源,您的数据库是,因此id生成属于db。这就是POST vs PUT发挥作用的地方。我想发布一个新的gecko记录到/api/geckos,或者我想把gecko记录123放到/api/geckos/123的位置。

如果数据库中没有条目,您应该仍然返回一个有效的响应:

{
    geckos: []
}

还有另外两件事,你应该使用getter/setter来获取和设置属性。

var gecko = this.store.createRecord('gecko', {
  date: new Date(),
  type: "gecko",                                     
});
console.log(gecko.get('id'), "gecko.id before save");
var promise = gecko.save();

而save是一个异步进程,它返回一个承诺,你可以等待以避免竞争条件。

promise.then(function(geckoRecord){
   // geckoRecord and geck are the same here, but it's good to know
   // it resolves the record
   console.log(gecko.get('id'), "gecko.id after save");
   console.log(geckoRecord.get('id'), "gecko.id after save");
});