如何取消订阅 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);
}
});
我有一个从 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);
}
});