【问题标题】:Ember data createRecord not working: "TypeError: undefined is not a function"Ember 数据 createRecord 不起作用:“TypeError:未定义不是函数”
【发布时间】:2014-07-25 03:28:01
【问题描述】:

我正在将 Ember 数据用于 Web 应用程序,在我尝试使用“createRecord”保存一些新数据之前,一切都非常顺利。

这是代码的要点:

App.Store = DS.Store.extend({
  adapter: DS.RESTAdapter.create({
    namespace: 'api'
  })
});

App.Training = DS.Model.extend({
  dateTimestamp: DS.attr('number'),
  dateTime: DS.attr('string'),
  dateDay: DS.attr('number'),
  dateWeekday: DS.attr('string'),
  dateMonth: DS.attr('string'),
  teacherId: DS.attr('number'),
  teacherFirstName: DS.attr('string'),
  teacherPhoneNumber: DS.attr('string'),
  teacherAvatarCss: DS.attr('string'),
  spotName: DS.attr('string'),
  spotNamespace: DS.attr('string'),
  spotId: DS.attr('number'),
  spotHasPicture: DS.attr('string'),
  spotPictureCss: DS.attr('string'),
  spotUrl: DS.attr('string')
});

我为后端构建了一个简单的 REST api,并且获取数据效果很好:

App.KalenderRoute = Em.Route.extend({
  model: function() {
    return this.store.find('training'); // This works!
  }
});

然后我尝试在我的控制器中调用一个操作来保存新记录:

App.KalenderController = Em.ArrayController.extend({
  actions: {
    addTraining: function(){
        var store = this.store;
        store.createRecord('training', {
            spotId: 5
        }); // This does not work :(
    }
  }
});

如果我理解正确,这应该使用 spotId 参数向 /api/training 发送一个 POST AJAX 请求。但是,似乎从未发送过 POST 请求,而是我的控制台说:

TypeError: undefined is not a function 

完整的堆栈跟踪:

DS.Store.Ember.Object.extend.createRecord ember-data.prod.js:1575
App.KalenderController.Em.ArrayController.extend.actions.addTraining App.js:197
Mixin.create.send ember.prod.js:15207
runRegisteredAction ember.prod.js:34269
Backburner.run ember.prod.js:7947
apply ember.prod.js:7779
run ember.prod.js:6415
handleRegisteredAction ember.prod.js:34267
(anonymous function) ember.prod.js:22582
m.event.dispatch jquery.min.js:3
r.handle

有没有人知道这是为什么?快把我逼疯了!

【问题讨论】:

  • 在不知道您使用的 Ember-Data 的确切版本的情况下,我们无法查明导致您的错误的行。

标签: javascript rest ember.js


【解决方案1】:

自 Ember Data 1.0beta+ 起无需定义商店。您只需定义适配器和序列化程序。

App.ApplicationAdapter= DS.RESTAdapter.extend({
  namespace: 'api'
});

App.Training = DS.Model.extend({
  dateTimestamp: DS.attr('number'),
  dateTime: DS.attr('string'),
  dateDay: DS.attr('number'),
  dateWeekday: DS.attr('string'),
  dateMonth: DS.attr('string'),
  teacherId: DS.attr('number'),
  teacherFirstName: DS.attr('string'),
  teacherPhoneNumber: DS.attr('string'),
  teacherAvatarCss: DS.attr('string'),
  spotName: DS.attr('string'),
  spotNamespace: DS.attr('string'),
  spotId: DS.attr('number'),
  spotHasPicture: DS.attr('string'),
  spotPictureCss: DS.attr('string'),
  spotUrl: DS.attr('string')
});

另外,在您对记录调用 save 之前,不会进行任何 ajax 调用

var record = this.store.createRecord('training',{
  spotId:1
});
record.save();

示例(为了好玩而延迟):http://emberjs.jsbin.com/OxIDiVU/856/edit

【讨论】:

  • 哇,原来 Bower 安装了旧版本的 Ember 数据,这就是造成所有麻烦的原因(我运行的是 0.13 而不是 1.0.0)。非常感谢您的详细回答,它帮助我确定了问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2016-01-14
  • 2015-08-04
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多