【问题标题】:How do I unsubscribe from the subscription set by Iron Router's waitOn?如何取消订阅 Iron Router 的 waitOn 设置的订阅?
【发布时间】:2015-05-01 23:55:40
【问题描述】:

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

这是我的出版物:

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


【解决方案1】:

听起来您想要的(如果我错了,请纠正我)与其说是取消订阅之前的搜索,不如说是反应性地订阅当前搜索并删除所有记录不被它所包围。如果是这样,您不需要手动管理退订 - 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);
  }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 2018-07-12
    • 2014-12-29
    • 2013-11-03
    • 1970-01-01
    相关资源
    最近更新 更多