Iron Router:如何向多个路由提供相同的数据

Iron Router: How to Provide Same Data to Multiple Routes

很明显如何提供特定于路线的数据,即通过使用控制器:

PostController = RouteController.extend({
  layoutTemplate: 'PostLayout',
  template: 'Post',
  waitOn: function () { return Meteor.subscribe('post', this.params._id); },
  data: function () { return Posts.findOne({_id: this.params._id}) },
  action: function () {
    this.render();
  }
});

但是一般如何为应用程序提供数据呢?如果每条路由都需要订阅相同的信息子集,那么 pub/sub 不需要在每次路由更改时都重新执行。谢谢!

在我看来,您正在寻找一个完全通用的 publication/subscription 方案,这样您就不必为每条路线定义 waitOn/data 选项组合,或者您定义的路由控制器。在这种情况下,您可以像这样简单地在服务器上发布一组给定的数据:

    Meteor.publish('someData', function() {
        return SomeDataCollection.find({});
    });

并在客户端订阅该组数据,如下所示:

    Meteor.subscribe('someData');

通过此 publication/subscription 配对设置,您将可以访问所有路线中提供的数据。您只需确保检查代码中是否存在不存在的数据,以便在客户端尚未加载数据时处理任何给定模板的首次加载。通过这种方式,您将永远不必为任何路由或路由控制器实际定义 waitOndata 选项。

如果您想以不同于通过路由控制器的方式使用 Iron Router,您还可以选择使用 Router.configure({}); 函数在全局范围内等待 one/many 订阅。要使用上面的示例:

    Router.configure({
        waitOn: function() {
            return Meteor.subscribe('someData');
        }
    });

有关此路线选项以及您在全球范围内可用的所有其他选项的信息,请查看 this