Ember.js:过渡到嵌套路由调用哪个动作?

时间:2013-12-07 20:39:40

标签: ember.js controller nested routes

我已遵循本指南的嵌套路线:http://emberjs.com/guides/routing/defining-your-routes/#toc_resources

我有一个嵌套路线:

App.Router.map(function () {
    this.resource('account', function() {
        this.route('register');
    });
});

在我的索引模板中,我调用了索引控制器的一个动作,就是这个:

App.IndexController = Ember.Controller.extend({
    actions: {
        doRegistration: function(){
            this.transitionToRoute('account.register');
        }
    }
});

一切都在这里工作,我的AccountRegisterController甚至被实例化我认为以下内容被记录到控制台:

App.AccountRegisterRoute = Ember.Route.extend({
    setupController: function(controller, model){
        console.log('setting up controller'+controller);
    }
});

这是我的AccountRegisterController:

App.AccountRegisterController = Ember.Controller.extend({
    actions: {
        register: function(){
            console.log('account register');
        },
        index: function(){
            console.log('account index');
        }
    }
});

问题是控制器的动作都没有被调用。为什么?如何判断transitionTo(...)要采取的行动?我做错了什么?

1 个答案:

答案 0 :(得分:0)

'transitionTo'不会调用操作,只是更改路径。

为了执行代码,您可以在路径上的不同挂钩中执行此操作。

你可以:

App.AccountRegisterRoute = Ember.Route.extend({
    beforeModel: function() {
        console.log('setting up controller'+controller);
        //write any register code here
    }
});

或者您可以将动作发送到路线挂钩:

App.AccountRegisterRoute = Ember.Route.extend({
    beforeModel: function() {
        this.send('register');
        this.transitionTo('account.welcome');

    }
});

您可能想要做的是先执行操作,然后在没有中间路线的情况下进行转换。像这样:

App.IndexController = Ember.Controller.extend({
    actions: {
        doRegistration: function(){
            //code to register user here.
            this.transitionToRoute('account.welcome');
        }
    }
});

如果您希望能够重用您的注册控制器,您可以将其定义为父控制器中的一个动作,然后它会冒出来,就好像您没有在子控制器或路径中定义它一样:

App.ApplicationRoute = Ember.Route.extend({
    actions: {
        doRegistration: function(){
            //code to register user here.
            this.transitionTo('account.welcome');
        }
    }
});