发现流星-退订

Discover meteor-Unsubscribe?

本文关键字:退订 流星 发现      更新时间:2023-09-26

我目前正在根据发现流星书进行自己的项目。

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

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

我可以轻松地搜索使用 javascript 调用的覆盖层。

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

例如,如果我在帖子列表页面

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

对于单个帖子页面也是如此。

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

不要使用 Meteor.publish 进行搜索。

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

然后,要停止每个搜索,直到下一个搜索完成(对自动完成不利),您可以查看使用 wait: false eg 调用Meteor.method

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