发现流星 - 取消订阅?

时间:2014-11-25 19:47:23

标签: javascript mongodb collections meteor publish-subscribe

我目前正致力于自己的项目,基于发现流星书。

我订阅了我的收藏'帖子'。

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

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

当我搜索时,它将始终返回订阅+搜索结果中包含的帖子作为结果。

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

单个帖子页面也是如此。

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

1 个答案:

答案 0 :(得分:3)

请勿使用Meteor.publish进行搜索。

  1. 在服务器上创建Meteor.method,而不是查找搜索结果。
  2. 创建仅限客户端(非托管)的集合var results = new Mongo.Collection(null)
  3. 执行搜索时,请删除所有结果results.remove({}),然后插入Meteor.method回调的结果。
  4. 然后,要停止每个搜索等到下一个搜索完成(自动完成不好),您可以查看调用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();
        }
      });
    }