使用错误的控制器路由?

时间:2015-08-14 14:34:37

标签: meteor iron-router

我有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')中的控制器声明,那么模板加载正常。因此,当我向 控制器询问时,它只使用了错误的控制器。

我必须遗漏一些东西,但这太奇怪了。

1 个答案:

答案 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()