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

Javascript MeteorJS:重新订阅/刷新收藏?,javascript,node.js,mongodb,meteor,Javascript,Node.js,Mongodb,Meteor,我目前正在从事meteor项目,我不太了解meteor解决问题的方法。 我有一个最初在pageload上调用的订阅。我在没有任何参数的情况下订阅以下出版物: Meteor.publish('testCollection', function(searchitem){ if(searchitem){ return testCollection.find({name:searchitem}); } else{ return testCollec

我目前正在从事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
            }
        });
    }
});
这非常有效,我从else案例中得到了结果。
但我希望用户能够在此集合中搜索名称。 因此,我的刷新想法是在提交searchbutton时使用:

Meteor.subscribe("testCollection","abc");
但这并不是在刷新我的客户端测试集合。
我怎样才能做到这一点?我是否必须取消订阅并再次订阅,如果是:如何订阅?

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

简言之,这一切都是关于重新订阅出版物。这可以通过多种方式实现,但最简单的(在我的竞争中也是最优雅的)是使用自动运行和反应源,如或。无论何时更改此源,都会触发新的订阅,并取消以前的订阅

来自Meteor文档:

例如,如果在反应计算中调用Meteor.subscribe 示例使用Tracker.autorun,订阅将自动 当计算无效或停止时取消;不是 需要对从内部自动运行进行的订阅调用停止

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

Tracker.autorun(function() {  
  if (Session.get('someCustomQuery'))
    Meteor.subscribe('testCollection', Session.get('someCustomQuery'));
});
我将推荐David Burles的本教程:

事件触发的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);
  }
});

清理数据库输入!用户可以将Mongo选择器作为
searchItem
,使用
check(searchItem,Match.OneOf(String,undefined))
。您能解释一下吗?在我的代码中,我应该在哪里传递这个Mongo选择器,我应该在哪里调用check函数?check函数用于证明变量只是字符串或未定义,对吗?是的。这样,您就可以确信客户发送的内容正是您所期望的。@smoksnes谢谢您的回答,我试过了,它立刻就起作用了。所以我必须在会话中使用Tracker.autorun()?为什么我不能简单地调用Meteor.subscribe('testCollection',searchitem),在我想要的地方(可能在eventhandler或其他东西中)?@ant45de->您应该能够直接调用subscribe,即使我没有尝试过。Meteor的强大之处在于它是反应性的,因此无论在哪里使用反应性组件,您都可以通过倾听反应性组件来简化代码。我添加了一个使用ReactiveVar而不是Session的示例,如果您和我一样不喜欢使用Session,而它只在一个模板中使用。@ant45de您应该参考文档,这是关于reactivity的。smoksnes,对于您的追踪器,您可能需要检查。另外,您知道您可以简单地调用函数,而不是编写
this
?想想看,您可能希望使用事件处理程序,这样它就不会被用户键入的每个字符触发。@ant45de开销是实现这一点的原因。您要做的是创建订阅以获取特定搜索的数据,然后如果该搜索发生更改,则更改数据。唯一的方法是取消以前的订阅并创建一个新的订阅,Tracker做得非常好。