MeteorJS:重新订阅/刷新收藏?

ant*_*5de 2 javascript mongodb node.js meteor

我正在研究我的流星项目,我不太了解Meteor的问题是什么.

我有一个订阅,最初在pageload上调用.我没有任何参数订阅以下出版物:

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
            }
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

这很有效,我从else-case得到了我的结果.
但我希望用户能够在此集合中搜索名称.所以我的提醒想法是在提交搜索按钮时使用:

Meteor.subscribe("testCollection","abc");
Run Code Online (Sandbox Code Playgroud)

但这并没有让我的客户端testCollection更新.我怎样才能做到这一点?我是否必须取消订阅并再次订阅,如果是的话:如何?

smo*_*nes 5

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

简而言之,这就是重新订阅该出版物.这可以通过多种方式完成,但最简单的(在我的观点中最优雅)是使用带有反应源的自动运行,例如SessionReactiveVar.每当更改此源时,都会触发新的订阅并取消之前的订阅.

来自Meteor docs:http: //docs.meteor.com/#/full/meteor_subscribe

如果您在反应计算中调用Meteor.subscribe,例如使用Tracker.autorun,则在计算失效或停止时,订阅将自动取消; 没有必要对从autorun内部进行的订阅调用stop.

您重新订阅的代码可能如下所示:

Tracker.autorun(function() {  
  if (Session.get('someCustomQuery'))
    Meteor.subscribe('testCollection', Session.get('someCustomQuery'));
});
Run Code Online (Sandbox Code Playgroud)

我会推荐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);
  }
});
Run Code Online (Sandbox Code Playgroud)

  • @ ant45de你应该参考这个文档,它是关于反应性的.smoksnes,您可能需要查看http://docs.meteor.com/#/full/template_autorun.另外你知道你可以简单地[`bind`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)函数而不是写`that = this `? (2认同)