具有相同控制器的路由是订阅服务器 n 次还是只订阅一次?

Do routes with same controller subscribe to server n times or just once?

我有一个包含四个选项卡的选项卡,每个选项卡都有一个具有相同控制器的路由。

所有四个选项卡共享相同的数据,menu,但使用数据的不同部分。

每次我点击一个选项卡,它会订阅服务器吗?

比如我第一次点击tab1,它会联系服务器获取数据menu,然后我点击tab2,它会再次联系服务器获取数据menu连我都拿到数据了?

如果是这样,我该如何避免呢?也许我应该重新设计代码,有什么好的想法吗?

MenuController = RouteController.extend({
  layoutTemplate: 'menuLayout',

  waitOn: function () { return Meteor.subscribe('menu', this.params._id); },

  data: function () { return Menu.findOne({_id: this.params._id}) },

});


this.route('/menu/tab1', {
  name: 'menu.tab1',
  template: 'MenuTab1',
  controller: MenuController,
});
this.route('/menu/tab2', {
  name: 'menu.tab2',
  template: 'MenuTab2',
  controller: MenuController,
});
this.route('/menu/tab3', {
  name: 'menu.tab3',
  template: 'MenuTab3',
  controller: MenuController,
});
this.route('/menu/tab4', {
  name: 'menu.tab4',
  template: 'MenuTab4',
  controller: MenuController,
});

随着 IR 的成熟,这种情况有所改变。我相信在当前的实现中,如果您在使用相同参数进行相同订阅的路由之间进行更改,订阅将不会停止并再次启动。换句话说,选项卡之间的切换不应启动和停止订阅(假设 this.params._id 保持不变)。

您可以通过在 menu 发布商的第一行添加 console.log('here') 来证明(或反驳)这一点。切换选项卡时,请检查命令行控制台。如果 'here' 只打印一次,您就会得到想要的结果。

无论结果如何,subs-manager 是普遍接受的路由间缓存订阅解决方案。