流星铁:路由器路由控制器改变了这个的上下文

时间:2015-12-11 23:56:40

标签: meteor routes this iron-router

我有一个检查用户是否已登录的功能,它看起来像这样:

var requireLogin = function () {
    if (! Meteor.user()) {
        if (Meteor.loggingIn()) {
            this.render(this.loadingTemplate);
        } else {
            this.render('accessDenied');
        }
    } else {
        this.next();
    }
};

这是一个简单的功能,当我在这样的钩子上使用它时它可以工作:

Router.onBeforeAction(requireLogin, {only: 'postSubmit'});

然而,当我尝试在这样的扩展路由控制器中调用它时:

LogInController = RouteController.extend({
    onBeforeAction: function () {
        requireLogin();
    }
});

它不起作用。但是我可以在logincontroller中将函数的上下文粘贴到onBeforeAction中,它会起作用。

LogInController = RouteController.extend({
    onBeforeAction: function () {
        if (! Meteor.user()) {
            if (Meteor.loggingIn()) {
                this.render(this.loadingTemplate);
            } else {
                this.render('accessDenied');
            }
        } else {
            this.next();
        }
    }
});

所以我需要做什么?我是否需要将此值传递给requireLogin函数,还是有更聪明的方法?

1 个答案:

答案 0 :(得分:1)

我相信您可以使用javascript' bind函数解决此问题,该函数将函数绑定到上下文:

LogInController = RouteController.extend({
    onBeforeAction: function () {
        requireLogin.bind(this)();
    }
});

但是,如果您只是直接将函数作为值传递,那么甚至可能不需要这样做,从而避免了可能导致上下文更改的重定向:

LogInController = RouteController.extend({
    onBeforeAction: requireLogin
});