重新订阅/刷新一个集合

MeteorJS: resubscribe/refresh a Collection?

本文关键字:一个 集合 新订阅 刷新      更新时间:2023-09-26

我目前正在做我的流星项目,我不太明白流星的方式对我的问题是什么

我有一个订阅,最初在页面加载时调用。我订阅以下不带任何参数的出版物:

Meteor.publish('testCollection', function(searchitem){
    if(searchitem){
        return testCollection.find({name:searchitem});
    }
    else{
        return testCollection.find({},{
            sort: { rating: -1 },
            limit: 5,
            fields: {
                _id:1,
                name:1,
                description:1
            }
        });
    }
});

这工作得很好,我从else-case中得到我的结果。
但是我希望用户能够在这个集合中搜索一个名字。所以我的刷新想法是在提交时使用searchbutton:

Meteor.subscribe("testCollection","abc");

但是这并没有刷新我的客户端testCollection。我怎样才能做到这一点呢?如果是,我是否需要退订并再次订阅?如何退订?

这里的关键是通过始终限制结果来限制在客户端发送(并可能存储)的数据。

简而言之就是重新订阅出版物。这可以通过多种方式实现,但最简单的(在我看来也是最优雅的)是将自动运行与响应源(如Session或ReactiveVar)一起使用。每当此源更改时,将触发一个新的订阅,并取消先前的订阅。

From Meteor docs:http://docs.meteor.com//全/meteor_subscribe

如果你调用Meteor。在响应式计算中订阅,例如使用Tracker的示例。自动运行时,订阅将自动进行当计算无效或停止时取消;这不是必须在autorun内部的订阅中调用stop。

重新订阅的代码可以像这样:

Tracker.autorun(function() {  
  if (Session.get('someCustomQuery'))
    Meteor.subscribe('testCollection', Session.get('someCustomQuery'));
});

我推荐David Burles的这个教程:

http://meteorcapture.com/simple-search-pattern/

带有ReactiveVar的示例代码,由事件触发:

Template.myTemplate.rendered = function(){
  var self = this;
  Tracker.autorun(function() {
    if (self.searchQuery.get())
    {
      var queryOptions = {
        query: self.searchQuery.get()
      };
      Meteor.subscribe('testCollection', queryOptions);
    }
  });
}
Template.myTemplate.created = function(){
  this.searchQuery = new ReactiveVar('');
};
Template.myTemplate.events({
  'keyup [type=search]': function(event, template) {
    template.searchQuery.set(event.target.value);
  }
});