我有一个我想在页面上显示的类别列表。我一直在寻找正确的方法来做几个小时,但我一直在寻找相互矛盾的信息和方法,这些信息和方法要么不再使用当前版本的Ember,要么被弃用。
创建应用程序和Ember-Data事物:
var App = Ember.Application.create();
App.ApplicationAdapter = DS.FixtureAdapter;
App.Store = DS.Store.extend({
adapter: 'DS.FixtureAdapter'
});
我正在使用Ember-Data和类别的一些夹具数据:
App.Category.FIXTURES = [{
id: 1,
name: 'Category 1',
description: 'The first category'
}, {
id: 2,
name: 'Category 2',
description: 'The second category'
}];
然后我创建一个模型来表示一个类别的实例(“版本”与版本实例具有类别实例的不同模型有关):
App.Category = DS.Model.extend({
versions: DS.hasMany('version'),
name: DS.attr('string'),
description: DS.attr('string')
});
然后我创建了一个ArrayController,但是我在填充内容方面遇到了麻烦。
App.CatagoriesController = Ember.ArrayController.create({
content: [],
init: function () {
this.set('content', ???);
}
});
由于它不可导航,所以没有连接到路线,所以我不能在路线中使用“模型”属性。
替换ArrayController中的???
,我尝试了几件事:
我尝试this.store.find('category')
就像示例中显示路由一样,但是我收到错误“Uncaught TypeError:无法读取属性'找到'为null”。
我尝试了App.Store.find('category')
并且给了我错误“Uncaught TypeError:undefined不是函数”。
任何帮助或推动正确的方向表示赞赏。我有一种感觉,我甚至没有朝着正确的方向前进。
答案 0 :(得分:1)
有几件事。
首先,请记住控制器是单件。所以你的init
函数只会在你的应用程序的整个生命周期中触发一次(这可能不是你想要的)。但这并不重要,因为......
您处理模型的方式不是Ember.js的设置方式。您不应该在控制器中获取模型,只能获取路径。这就是控制器上没有store
属性的原因。您需要在路线上实施model
挂钩,如下所示:
App.CategoriesRoute = Ember.Route.extend({
model: function() {
return this.store.find('category');
}
});
从那里开始,Ember会自动将控制器上的model
属性(不 content
属性,不要使用该属性)设置为从中返回的数据model
挂钩。
因此,只需从控制器中删除content
属性和init
函数,并在模型中实现该挂钩,您应该好好去。