如何取消订阅 Iron Router 的 waitOn 设置的订阅?

How do I unsubscribe from the subscription set by Iron Router's waitOn?

我有一个从 collection 中获取的项目列表,我想让它根据单击的按钮显示不同的内容。我想我会通过更新出版物的会议来做到这一点。

这是我的出版物:

Meteor.publish('stuff', function(filter) {
  var nameVar = filter || "default"
  return myStuff.find({name: nameVar})
})

我在路由器中订阅的:

Router.route('/', {
  name: 'home',
  layoutTemplate: 'homeLayout',
  waitOn: function() {
    return Meteor.subscribe('stuff', Session.get('filter'));
  }
});

然后让按钮执行它们的操作(它们每个都有一个与我要过滤的内容相匹配的 ID):

Template.buttonFilter.events({
  'click button': function(event, template) {
    var buttonId = event.currentTarget.id
    Meteor.subscribe('stuff', Session.set('filter', buttonId))
  }
})

但是,当我单击一个按钮时,它不会取消订阅我第一次通过路由器订阅的内容,只会取消我上次单击按钮时设置的内容。我真的不明白为什么或如何解决它。

编辑:我不认为这是重复的,因为其他问题的答案都是关于改变路线的,而我没有这样做。

听起来你想要的(如果我错了请纠正我)与其说是取消订阅先前的搜索,不如说是被动地订阅当前的搜索和删除所有未包含在其中的记录。如果是这样,您不需要手动管理退订 - Meteor 会为您完成;你只需要让你的订阅反应。

Iron Router 的 waitOn 不会在每次订阅更改时重新运行。为此,有几种选择。快速而肮脏的选择是将订阅从 waitOn 移动到 onBeforeAction,每次都会重新运行:

Router.route('/', {
  name: 'home',
  layoutTemplate: 'homeLayout',
  onBeforeAction: function() {
    Meteor.subscribe('stuff', Session.get('filter'));
    this.next(); //make sure to include
  }
});

或者你可以在路由器外进行:

Tracker.autorun(function(){
  var filter = Session.get('filter');
  Meteor.subscribe('stuff', filter);
});

无论哪种情况,您都不需要从 template.events 更改订阅 - 只需更改会话值即可。

Template.buttonFilter.events({
  'click button': function(event, template) {
    var buttonId = event.currentTarget.id;
    Session.set('filter', buttonId);
  }
});