Meteor和Iron-router:订阅生命周期

时间:2014-01-13 21:31:42

标签: meteor iron-router

据我所知,当我在一个铁路由器钩子里面的结果集中,就像之前:或者waitOn:一样,它工作正常,但是一旦另一条路线运行,它似乎就会被拆除。有谁知道这是发生了什么?

假设它是,这是否意味着只有在路由中保留订阅的方法是订阅除Router.map()函数之外的其他地方?

2 个答案:

答案 0 :(得分:7)

如果要维护路由之间的订阅,则必须重新订阅。实现此目标的简单方法是使用Controllers。还值得一提的是,Iron-Router / Meteor足够聪明,可以知道何时重新使用路由之间的相同订阅,因此它们不会再次加载。

你可以采取一种方式:

ProjectController = RouteController.extend({
    before: [
        function() {
            this.subscribe("project.comments", this.params.projectId).wait();
            this.subscribe("project.log", this.params.projectId).wait();
        }
    ]
});

Router.map(function () {
  this.route('project.overview', {
    path: '/project/:projectId/overview',
    controller: 'ProjectController'
  });

  this.route('project.tasks', {
    path: '/project/:projectId/tasks',
    controller: 'ProjectController'
  });
});

现在“project.overview”和“project.tasks”路线将订阅“project.comments”和“project.log”。

然后,您可以创建一个特定于路由的控制器,并从“ProjectController”扩展到特定于路由的订阅:

ProjectController = RouteController.extend({
    before: [
        function() {
            this.subscribe("project.comments", this.params.projectId).wait();
            this.subscribe("project.log", this.params.projectId).wait();
        }
    ]
});

ProjectOverviewController = ProjectController.extend({
    before: [
        function() {
            this.subscribe("project.stats", this.params.projectId).wait();
        }
    ]
});

Router.map(function () {
  this.route('project.overview', {
    path: '/project/:projectId/overview',
    controller: 'ProjectOverviewController'
  });

  this.route('project.tasks', {
    path: '/project/:projectId/tasks',
    controller: 'ProjectController'
  });
});

“project.overview”路线现在将订阅“project.comments”,“project.log”和“project.stats”。

如果您需要应用程序范围的订阅,另一种方法是使用“Router.before”挂钩(https://github.com/EventedMind/iron-router#using-hooks):

Router.before(function() {
    this.subscribe("global.sub");
});

答案 1 :(得分:4)

您可以在Router.configure中为所有路线定义订阅:

Router.configure({
    waitOn: function() { 
        return Meteor.subscribe('my-subscription');
    }
});