使用Ember数据时,DS.hasMany会导致'typekey'错误

时间:2014-11-28 15:27:08

标签: ember.js ember-data

当我在模型中使用'hasMany'来引用存储在夹具中的ember数据(canary)时,我得到了这个错误......

Error while processing route: bookings Cannot read property 'typeKey' of undefined TypeError: Cannot read property 'typeKey' of undefined

我在SO上看到的其他例子似乎不是完全相同的问题。我试图在这里重新创建问题,如果您在此示例中取消注释'hasMany'部分,那么它会出错

http://emberjs.jsbin.com/yukahoduco/1/

App.Todo = DS.Model.extend({
  body: DS.attr('string')
  messages: DS.hasMany('message')
});

App.Message = DS.Model.extend({
    user: DS.attr('string'),
    subject: DS.attr('string')
});

App.Todo.FIXTURES = [
  {
    id: 1, 
    body: 'First Todo',
    messages: [{
      user: 'Harry',
      subject: 'Buy shaving cream'
    }]
  },
  {
    id: 2, 
    body: 'Second Todo',
    messages: [{
      user: 'Bob',
      subject: 'Buy razors'
    }]
  }
];

2 个答案:

答案 0 :(得分:1)

注意:我在你的小提琴中试过这个并且它返回了一个错误。我不知道新版本是否发生了重大变化,或者版本的组合是否错误。但是,我可以告诉您,此代码已使用1.7.01.0.0-beta.10进行了本地测试(ember-cli 0.1.2的默认值)

模特的灯具:

FixtureAdapter的Fixtures不是进入你的应用程序的数据,它的数据已经存在。因此,您要在类级别(而不是模型实例)创建数据,即您添加记录就像将行保存到表中一样。

App.Todo.FIXTURES = [
  {
    id: 1,
    body: "First Todo",
    messages: [100]
  },
  {
    id: 2, 
    body: "Second Todo",
    messages: [200]
  }
];

App.Message.FIXTURES = [
  {
    id: 100,
    "user": "Harry",
    "subject": "Buy shaving cream",
    todo: 1
  },
  {
    id: 200,
    "user": "Bob",
    "subject": "Buy razors",
    todo: 2
  }
];

export default Ember.Controller.extend({
  actions: {
    new: function() {
      var newRecord = this.store
                          .createRecord('todo', {
                             body: this.get('newBody'),
                             messages: [100]
                          });
    }
  }
}

);

然后,在您的模型中,您可以设置这样的关系:

App.Todo = DS.Model.extend({
  body:     DS.attr('string'),
  // We need to set async: true for the FixtureAdapter to load the relations
  messages: DS.hasMany('message', { async: true })
});

var Message = DS.Model.extend({
  user:    DS.attr('string'),
  subject: DS.attr('string'),
  todo:    DS.belongsTo('todo')
});

不为模型设置灯具时

如果您想使用问题中显示的格式加载数据:

{
  id: 1, 
  body: 'First Todo',
  messages: [{
    user: 'Harry',
    subject: 'Buy shaving cream'
  }]
}

您需要设置一个处理嵌入数据的序列化程序(DS.RESTSerializerDS.JSONSerializerDS.ActiveModelSerializer),方法是在创建过程中将DS.EmbeddedRecordsMixin传递给它。请参阅:http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html

答案 1 :(得分:0)

我认为以下行导致了您的问题:

user: DS.belongsTo('string')

没有声明String模型,因此这将导致容器尝试查找时发布的错误。我在hasMany模型上包含Todo关系时发生这种情况的原因是(我认为),因为这会强制加载Message模型,这会导致加载关系。如果没有hasMany关系,则永远不会使用Message模型,并且永远不会发现错误。