【问题标题】:MeteorJS: resubscribe/refresh a Collection?MeteorJS:重新订阅/刷新收藏?
【发布时间】:2015-09-08 20:36:27
【问题描述】:

我目前正在处理我的流星项目,但我不太了解流星解决我的问题的方法是什么。

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

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 中得到了结果。
但我希望用户能够在此集合中搜索名称。 所以我的刷新思路是在提交搜索按钮的时候使用:

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

但这并没有刷新我的客户端 testCollection。 我怎样才能做到这一点?如果是,我是否必须取消订阅并重新订阅:如何?

【问题讨论】:

  • 清理您的数据库输入!用户可以将 Mongo 选择器传递为 searchItem,使用 check(searchItem, Match.OneOf(String, undefined))
  • 你能给我解释一下吗?我应该在我的代码中在哪里传递这个 Mongo 选择器,我应该在哪里调用检查函数?
  • check-function 是为了让发布者证明这个变量只是一个字符串或者未定义的,对吧?
  • 是的。这样您就可以确定客户端发送的内容是您所期望的。

标签: javascript node.js mongodb meteor


【解决方案1】:

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

简而言之,就是重新订阅该出版物。这可以通过多种方式完成,但最简单的(在我看来也是最优雅的)是将 autorun 与 SessionReactiveVar 等反应式源一起使用。每当更改此来源时,都会触发新的订阅并取消之前的订阅。

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

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

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

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);
  }
});

【讨论】:

  • @smoksnes 感谢您的回答,我试过了,它立即生效。所以我必须在会话中使用 Tracker.autorun() 吗?为什么我不能简单地调用 Meteor.subscribe('testCollection',searchitem) 在我想要的地方(可能在事件处理程序或其他地方)?
  • @ant45de -> 你应该可以直接调用 subscribe,虽然我没试过。 Meteor 的强大之处在于它是响应式的,因此您可以通过侦听响应式组件来简化代码,无论它们在哪里使用。我添加了一个使用 ReactiveVar 而不是 Session 的示例,如果您像我一样不喜欢仅在一个模板中使用 Session。
  • @ant45de 你应该参考文档,它是关于反应性的。 smoksnes,对于您的 Tracker,您可能需要检查 docs.meteor.com/#/full/template_autorun。你也知道你可以简单地bind这个函数而不是写that = this吗?
  • 想一想,您可能想_.debounce 事件处理程序,这样它就不会被用户键入的每个字符触发。
  • @ant45de 开销使之成为可能。您要做的是创建订阅以获取特定搜索的数据,然后如果该搜索更改,则更改数据。这样做的唯一方法是取消之前的订阅并创建一个新订阅,Tracker 做得非常好。
猜你喜欢
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多