Meteor Iron Router首先进入路由的waitOn而不是Router.onBeforeAction

时间:2014-12-23 14:31:13

标签: meteor iron-router

我有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函数永远不会被调用。

1 个答案:

答案 0 :(得分:0)

在OnBeforeAction之前调用

waitOn。这种行为是核心。来自铁路由器文档:

  

另一种方法是使用waitOn而不是subscribe。这具有相同的效果,但会自动缩短您的路由操作以及任何挂钩之前的任何操作(参见下文),而是呈现loadingTemplate。

Source

要处理订阅,您可以使用“订阅”选项:

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');
    }
  }
});

Source