正确的实施搜索方式?

时间:2016-10-27 06:04:15

标签: javascript meteor

我正在尝试在我的流星应用中实现搜索图书。

所以我有这个名为Books的集合,我需要创建一个按照标题搜索书籍的逻辑。

经过一整天阅读Meteor文档后,我实现了搜索逻辑,但我不确定这是否是最好的方法。

这就是我的所作所为:

服务器

Meteor.publish('Books', constraints => {
    // Validate constraints, and generate search query

    return Books.find(<search query>);
});

客户端(React组件)

Meteor.subscribe('Books', { <search constraints> }, {
        onReady: function () { this.setState({ books: Books.find().fetch() }) }.bind(this)
 });

但是我发现Books.find().fetch()函数中的onReady返回了搜索结果的前一组追加(但删除了重复项),而不仅仅是返回搜索结果。

这实在是不直观,因为在填充新订阅/发布周期的结果之前,前一组集合未被清除。

所以,我通过在客户端再次执行搜索查询来解决这个问题:

Meteor.subscribe('Books', { <search constraints> }, {
        onReady: function () { this.setState({ books: Books.find(<search query>).fetch() }) }.bind(this)
 });

但这确实感觉不对,因为我在服务器和客户端都执行了两次搜索查询。

是否必须在客户端进行额外的查询?

如果是,那么我应该从服务器中删除搜索逻辑吗?

如果是,那么客户端 Minimongo 中的所有Books会在客户端搜索时出现(例如,由于分页)?

是否有更合适或“标准”的方式来实施此类操作,还是我误解了Meteor的publish/subscribe必须使用的方式?

1 个答案:

答案 0 :(得分:0)

使用会话存储搜索约束并在tracker.autorun中订阅书籍,该书籍订阅会话更改的书籍。

Templae.yourTemplateName.onCreated(function(){
       var self = this;
       self.autorun(function(){
          var searchQuery =Session.get("searchqery"); 
          self.subscribe( 'Books',searchQuery)
       })
    })