我有一个检查用户是否已登录的功能,它看起来像这样:
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函数,还是有更聪明的方法?
答案 0 :(得分:1)
我相信您可以使用javascript' bind
函数解决此问题,该函数将函数绑定到上下文:
LogInController = RouteController.extend({
onBeforeAction: function () {
requireLogin.bind(this)();
}
});
但是,如果您只是直接将函数作为值传递,那么甚至可能不需要这样做,从而避免了可能导致上下文更改的重定向:
LogInController = RouteController.extend({
onBeforeAction: requireLogin
});