我有嵌套路线,如:
this.resource('collections', { path: '/collections' }, function() {
this.resource('collection', { path: '/:collection_id' }, function() {
this.resource('movies', { path: '/movies' }, function() {
this.resource('moview', { path: '/:movie_id' });
});
});
});
如果我创建一个基本路线,如:
App.MovieRoute = Em.Route.extend({
renderTemplate: function() {
this.render({outlet: 'movies'});
}
});
通过电影模板中的链接访问路线。
我的模板可以直接访问模型属性:
<script type="text/x-handlebars" data-template-name="movie">
{{movieName}}
</script>
但是如果我添加一个基本的控制器:
App.MovieController = Ember.ArrayController.extend({
});
并将setupController添加到模型中: App.MovieRoute = Em.Route.extend({
renderTemplate: function() {
this.render({outlet: 'movies'});
},
setupController: function(controller, model) {
}
});
我无法再访问模板中的变量movieName(未定义)。如果我添加控制器并且没有实现设置控制器,它将失败并显示错误“undefined is a function”。我可以添加到Movie控制器中,以便它不会干扰模板中变量的访问吗?我试过添加一个在控制器中加载超级的init而没有运气:
App.MovieController = Ember.ArrayController.extend({
init: function() {
this._super();
}
});
答案 0 :(得分:1)
setupController的默认实现是(相当于):
setupController: function(controller, model) {
controller.set("model", model);
}
你刚刚用空实现覆盖了它。
答案 1 :(得分:1)
正如Meori Oransky在帖子中指出的那样,你覆盖了setupController的默认功能。默认情况下,setupController将实例化控制器的模型,因此您需要确保首先执行此操作。
您希望电影路线看起来像这样:
App.MovieRoute = Em.Route.extend({
setupController: function(controller, model) {
controller.set('model', model);
},
renderTemplate: function() {
this.render({outlet: 'movies'});
}
});
除此之外,setupController允许您对模型中发生的事情具有更大的灵活性。您可以操纵数据,验证条件并在必要时重新路由。您可以指定要使用的控制器等。但至少,您需要始终为控制器设置模型,否则您将丢失模板中的此挂钩。