Ember.js - 添加基本控制器使模型数据在模板中不可用

时间:2014-05-20 18:02:47

标签: javascript ember.js

我有嵌套路线,如:

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();
    }
});

2 个答案:

答案 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允许您对模型中发生的事情具有更大的灵活性。您可以操纵数据,验证条件并在必要时重新路由。您可以指定要使用的控制器等。但至少,您需要始终为控制器设置模型,否则您将丢失模板中的此挂钩。