我有2个控制器(铁路由器),一个用于访问位(登录等),另一个用于登录区域。但由于某种原因,我的一条路线选择使用错误的控制器,即使我明确说明要使用哪一个。这是代码:
// Controllers
AccessController = RouteController.extend({
layoutTemplate: 'AccessMaster',
onBeforeAction: function () {
if (Meteor.user()) { // If user is logged in then take them to the Dashboard
this.redirect('/app/dashboard');
} else {
this.next();
}
}
});
DashboardController = RouteController.extend({
layoutTemplate: 'DashboardMaster',
onBeforeAction: function () {
if (!Meteor.user()) { // If user is not logged in then take them to the login
this.redirect('/app/login');
} else {
this.next();
}
}
});
// Routes
Router.route("/app/signup", {
name: 'Signup',
controller: 'AccessController'
});
Router.route("/app/login", {
name: 'Login',
controller: 'AccessController'
});
Router.route("/app/account", {
name: 'Account',
controller: 'DashboardController',
loadingTemplate: 'Loading',
action: function () {
this.render('Account');
}
});
Router.route("/app/dashboard", {
name: 'Dashboard',
controller: 'DashboardController',
loadingTemplate: 'Loading',
waitOn: function () {
…
},
action: function () {
this.render('Dashboard', {
data: {
…
}
});
}
});
当我访问app/account
时,我按照app/dashboard
中的指示重定向到AccessController
。为什么app/account
路由使用了错误的控制器逻辑?
编辑:奇怪的是,如果我删除违规路线(controller: 'DashboardController'
)中的控制器声明,那么模板加载正常。因此,当我向 控制器询问时,它只使用了错误的控制器。
我必须遗漏一些东西,但这太奇怪了。
答案 0 :(得分:1)
我认为您的问题来自于您在两个控制器中使用Meteor.user()
这一事实,即实际的用户文档。和任何其他集合一样,它可能在应用程序启动时没有立即就绪。
如果在控制器中添加console.log(Meteor.user())
,您将在返回用户文档之前看到它是第一次undefined
。
因此路由使用了正确的控制器,但Meteor.user()
为undefined
,因此您被重定向到/app/login
,其中Meteor.user()
(可能已准备就绪)返回文档,以便您重定向到{ {1}}。
为了防止这种行为,我使用/app/dashboard
无论如何都可以使用Meteor.userId()
。当我第一次测试Meteor.user()
返回的内容并且我需要有关用户的更多信息时,我只使用Meteor.userId()
。