javascript - 发现 meteor 取消订阅?

标签 javascript mongodb collections meteor publish-subscribe

我目前正在根据发现 meteor 书开展自己的项目。

我订阅了我的收藏“帖子”。

我正在使用 easy-search(一个搜索包),目前遇到了一些问题。

我可以轻松搜索使用 javascript 调用的叠加层。

当我搜索时,它总是会返回订阅中包含的帖子 + 搜索结果作为结果。

例如,如果我在帖子列表页面中搜索 Chocolate,结果将是帖子列表页面中的每个帖子 + chocolate 关键字帖子。

单个帖子页面也是如此。

我想知道是否可以通过点击事件暂时取消订阅。在这种情况下,将是搜索按钮。

最佳答案

不要使用 Meteor.publish用于搜索。

  1. 创建 Meteor.method而不是在服务器上查找搜索结果。
  2. 创建仅客户端(非托管)集合 var results = new Mongo.Collection(null)
  3. 执行搜索时,删除所有结果 results.remove({})然后插入 Meteor.method 回调的结果。

然后,要停止每次搜索,等待下一次搜索完成(不利于自动完成),您可以调用 Meteor.method with wait: false例如。

Meteor.apply('mySearchMethod',[parameters], {wait: false}, function(err, res){});

要完成这项工作,您需要调用 this.unblock()在搜索方法中。


示例代码

var searching = new ReactiveVar(false);
var currentSearch = "";
var results = new Mongo.Collection(null);
var search = function(searchText){
  searchText = searchText.trim();
  if (searchText === currentSearch){
     // abort search if query wasn't different
     return;
  }
  // clear results immediately (don't show expired results)
  // NOTE: this can cause "flicker" as results are removed / re added
  results.remove({});
  if (searchText === ""){
     return;
  } 
  searching.set(true);
  performSearch(searchText)
};
var performSearch = _.debounce(function(searchText){
  currentSearch = searchText;
  Meteor.apply('mySearchMethod', [searchText], {wait: false}, function(err, res){
    if (err){
        console.error(err);
    } 
    if (currentSearrch !== searchText){
       // query changed, results aren't relevant
       return;
    }
    for (var i = 0; i < res.length; i++){
       results.insert(res[i]);
    }
    searching.set(false);
  })
}, 300);

Template.myTemplate.events({
  'input #mySearchBox': function(e){
    search($(e.currentTarget).val());
  }
});

Template.myTemplate.heplers({
  'searchResults': function(){
     return results.find();
  },
  'showSpinner': function(){
     return searching.get();
  }
})


if (Meteor.isServer){
  Meteor.methods({
    'mySearchMethod': function(searchText){
         check(searchText, String);
         this.unblock();
         var searchExp = new RegExp(RexExp.escape(searchText), 'i');
         return myCollection.find({myField: searchExp}).fetch();
    }
  });
}

关于javascript - 发现 meteor 取消订阅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27135382/

相关文章:

javascript - 使用 Mongoose/MongoDB 创建一个独立的用户模式并将其嵌入到消息模式中?

java - 非多线程应用程序中 vector 的使用

VB.net:我的线程安全列表解决方案真的安全吗?

javascript - 如何使用 VS Code 调试 Node.js 中的私有(private)类字段?

javascript - 如何通过javascript将数据数组推送到另一个数组而无需循环

javascript - 单击 <li> 列表仅适用于第一个

node.js - 将 Small Parse ID 迁移到普通 MongoDB 的 ObjectID

node.js - 使用express和Mongodb进行Graphql查询无法正常工作?

java - 使用 Hibernate 对 @OneToMany 包关系的多次引用

javascript - 有没有办法使用 javascript 来增加时间?