我有Meteor Roles包,我正在尝试定义管理路由:
var requireLogin = function() {
if (! Meteor.user()) {
debugger // #1
if (Meteor.loggingIn()) {
this.render(this.loadingTemplate);
} else {
console.log("no user");
this.render('AdminLogin');
}
} else {
this.next();
}
};
Router.onBeforeAction(requireLogin, {only: ['AdminMain']});
Router.route('/admin', {
name: 'AdminMain',
layoutTemplate: 'AdminLayout',
waitOn: function(){
debugger // #2
return [
Meteor.subscribe("appointments")
]
}
});
我在服务器/出版物中有这个:
Meteor.publish('appointments', function() {
if (Roles.userIsInRole(this.userId, ['assistant','admin'])) {
return Appointments.find();
} else {
console.log("no user");
return [];
}
});
启动的 第一个 调试程序是waitOn
中的调试程序#2。为什么?我准确地为该路线指定了OnBeforeAction
。根据Iron Router指南, 当用户导航到“/ admin”时,我们的onBeforeAction挂钩功能将在我们的路由功能之前运行。如果用户未登录,则永远不会调用路由功能,并且AdminPage将不会呈现给页面。
嗯,考虑到调试器首先停止waitOn进行Meteor订阅,看起来肯定会在OnBeforeAction
之前调用路由函数。由于此订阅需要管理员用户登录服务器,如果我在调试器上按继续,服务器控制台将记录“无用户”,并且加载屏幕将永远持续下去。 <{1}}的实际OnBeforeAction
函数永远不会被调用。
答案 0 :(得分:0)
waitOn。这种行为是核心。来自铁路由器文档:
另一种方法是使用waitOn而不是subscribe。这具有相同的效果,但会自动缩短您的路由操作以及任何挂钩之前的任何操作(参见下文),而是呈现loadingTemplate。
要处理订阅,您可以使用“订阅”选项:
Router.route('/post/:_id', {
subscriptions: function() {
// returning a subscription handle or an array of subscription handles
// adds them to the wait list.
return Meteor.subscribe('item', this.params._id);
},
action: function () {
if (this.ready()) {
this.render();
} else {
this.render('Loading');
}
}
});