[英]Ember.js: Using an ArrayController without a route?
我有一个要显示在页面上的类别列表。 我已经花了几个小时寻找正确的方法,但是我一直在寻找冲突的信息和方法,这些信息和方法要么不再与当前版本的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', ???);
}
});
由于它不可导航,因此未连接到路由,因此无法在路由中使用“ model”属性。
更换???
在ArrayController中,我尝试了几件事:
我尝试了this.store.find('category')
如路线示例所示,但是出现错误“ Uncaught TypeError:无法读取null的属性'find'”。
我尝试了App.Store.find('category')
,这给了我错误“未捕获的TypeError:未定义不是函数”。
任何帮助或朝着正确方向的推动都将受到赞赏。 我感觉自己甚至没有朝着正确的方向前进。
有几件事。
首先,请记住,控制器是单例的。 因此,您的init
函数在应用程序的整个生命周期中只会触发一次(这可能不是您想要的)。 但这并不重要,因为...
处理模型的方式不是Ember.js的设置方式。 您不应该仅在路由中获取控制器中的模型。 这就是为什么控制器上没有store
属性的原因。 您需要在路线上实现model
挂钩,如下所示:
App.CategoriesRoute = Ember.Route.extend({
model: function() {
return this.store.find('category');
}
});
从那里,Ember将自动在控制器上将您从model
挂钩返回的数据设置为model
属性( 不是 content
属性,不要使用该属性)。
因此,只需从控制器中删除content
属性和init
函数,并在模型中实现该钩子,就可以了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.