javascript - meteor JS : resubscribe/refresh a Collection?

标签 javascript node.js mongodb meteor

我目前正在开发 Meteor 项目,但不太了解解决我的问题的 Meteor 方法是什么。

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

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。 我怎样才能实现这个目标?我是否必须取消订阅并再次订阅(如果是):如何?

最佳答案

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

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

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

If you call Meteor.subscribe within a reactive computation, for example using Tracker.autorun, the subscription will automatically be cancelled when the computation is invalidated or stopped; it's not necessary to call stop on subscriptions made from inside 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);
  }
});

关于javascript - meteor JS : resubscribe/refresh a Collection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32456174/

相关文章:

javascript - 使用 Promise 观察游标并停止游标

javascript - 如何在请求中操作 res.locals 对象?

javascript - 当我在 codeigniter 中单击添加按钮时,我如何在动态表中获得序列号

javascript - 如何在 Asp.net 中使用 java 脚本将参数传递给同一页面

Node.js - 以平台无关的方式查找主目录

ios - Flutter ios 设备不会从 FCM 通知触发 onMessage。实现 APN 时 Sendtodevice 失败

node.js - Mongoose 和 promise : how to get an array of query results?

javascript - Mongoose find()不返回结果

mysql - 对于大型数据集,mongoDB 或 Cassandra 是否比 MySQL 更好?

javascript - 带有管理面板和客户端面板的 MEAN 应用程序