当我在模型中使用'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'
}]
}
];
答案 0 :(得分:1)
注意:我在你的小提琴中试过这个并且它返回了一个错误。我不知道新版本是否发生了重大变化,或者版本的组合是否错误。但是,我可以告诉您,此代码已使用1.7.0
和1.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.RESTSerializer
或DS.JSONSerializer
或DS.ActiveModelSerializer
),方法是在创建过程中将DS.EmbeddedRecordsMixin
传递给它。请参阅:http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html
答案 1 :(得分:0)
我认为以下行导致了您的问题:
user: DS.belongsTo('string')
没有声明String
模型,因此这将导致容器尝试查找时发布的错误。我在hasMany
模型上包含Todo
关系时发生这种情况的原因是(我认为),因为这会强制加载Message
模型,这会导致加载关系。如果没有hasMany
关系,则永远不会使用Message
模型,并且永远不会发现错误。