Iron Router控制器继承,访问文件外部的ApplicationController

时间:2015-02-01 10:56:20

标签: meteor

我想为我的路线实现继承方案。我希望我的所有路由都从我的ApplicationController继承

ApplicationController = RouteController.extend({
  subscriptions: function() {
    this.user = Meteor.subscribe('userEarnings', Meteor.userId());
  },
  data: function() {
    return {
      currentUser: Users.findOne(),
      userReady: this.user.ready()
    };
  }
});

确保我的用户集合上订阅了所有自定义字段。我将上述内容存储在文件client/lib/routes/main.js中。我希望能够使用client/lib/routes/*.js扩展ApplicationController中的其他控制器,就像这样

historyController = ApplicationController.extend({
  layoutTemplate: 'dashboardLayout',
  subscriptions: function() {
    this.subs = Meteor.subscribe("userPurchaseHistory", Meteor.userId());
  },
  data: function() {
    console.log(this.user.ready());
    return {
      purchases: Purchases.find(),
      ready: this.subs.ready()
    };
  }
});

Router.route('history', {
  path: '/history',
  loginRequired: 'entrySignIn',
  controller: historyController
});

但是目前,我得到

Uncaught ReferenceError: ApplicationController is not defined

如何在文件之外访问ApplicationController?我认为通过不使用var,变量可以全局访问。

1 个答案:

答案 0 :(得分:1)

这是一个加载订单问题。根据{{​​3}}:

  

文件加载顺序

     

所有匹配main。*的文件都会在其他所有文件后移动,并保留其顺序。

     

...

     

在目录中,文件按字母顺序按文件名加载。

尝试将ApplicationController定义放在client/lib/routes/application-controller/application-controller.js或类似的东西中,以确保它在任何其他控制器尝试从其继承之前运行。如果它不被称为main.js,将它放在子目录中将确保它在父目录中的东西之前添加并避免潜在的字母顺序问题。