Ember数据未为新实例创建ID

时间:2015-05-30 13:43:34

标签: javascript ember.js ember-data

我使用本地存储适配器创建了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)。

以下是Ember发送到我服务器的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')实现路由以检索它。

2 个答案:

答案 0 :(得分:3)

当您使用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'))
})

答案 1 :(得分:1)

Ember Data不会创建ID,没有任何东西可以阻止它生成非唯一ID。当涉及gecko记录时,它不是真相的来源,您的数据库是,因此id生成属于db。这是POST与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");
});