我遇到了一个小小的订阅问题,在必要的时候不会停止。
我有一个推文集合,我通过发布/订阅过程显示给我的客户端。 这是我的出版物:
Meteor.publish('tweets', function(params) {
return Tweets.find({hashtag: params});
});
你可以看到我有一个标签来对它们进行排序,并且只显示带有指定hastag的推文。 这是我的订阅客户端代码:
var sub;
Template.hashtagPage.rendered = function() {
// Get the hashtag of the current page
hashtag = document.getElementById('hashtag').innerHTML;
sub = Meteor.subscribe('tweets', hashtag);
};
Template.hashtagPage.destroyed = function(){
sub.stop();
};
在我的模板中,我会显示订阅中的每条推文。我为显示推文的每个页面都获得了相同的模板。
但这是我的问题。当我第一次去显示带有#strong> #first 主题标签的推文的页面时,我会毫无问题地得到它们。但是,如果接下来我转到显示带有#strong> #second 主题标签的推文的页面,我的客户端会使用#strong> #first 和 #second
通常,订阅上的.stop()应该从客户端的缓存中删除订阅数据(docs.meteor.com/#meteor_subscribe)。但我没有。我试图改变sub.stop()的位置。当它与订阅在同一模板函数上时,它可以工作,但是,不会显示任何推文。
提前致谢
答案 0 :(得分:0)
更标准的方法是将订阅参数设置为Session变量,并使用Deps.autorun()启动和停止相应的订阅。
在渲染的函数中:
Session.set( "hashTag", hashTag);
在顶级客户端代码中:
Deps.autorun( function(){
Meteor.subscribe( 'tweets', Session.get("hashTag") );
});
当Session变量更新时,自动运行功能将在旧订阅句柄上调用stop。这在docs for subscribe中提到。
如果您确实希望自己管理启动和停止订阅,请确保每个订阅句柄都存储在自己的变量中,例如subHandles[ hashTag ]
,否则您可能会在调用stop之前覆盖所需的句柄。< / p>
答案 1 :(得分:-1)
使用会话变量。一旦设置完成,您就不必重新运行订阅。从流星到救援的反应变量。
Template.hashtagPage.rendered = function() {
// Get the hashtag of the current page
Meteor.subscribe('tweets', Session.get('hashtag'));
};
Template.hashtagPage.events {
'blur #hashtag': function(event) {
Session.set('hashtag', event.target.val());
}
};
通常情况下,我会将订阅放入路线(使用铁路由器)和waitOn