我正在尝试在我的流星应用中实现搜索图书。
所以我有这个名为Books
的集合,我需要创建一个按照标题搜索书籍的逻辑。
经过一整天阅读Meteor文档后,我实现了搜索逻辑,但我不确定这是否是最好的方法。
这就是我的所作所为:
Meteor.publish('Books', constraints => {
// Validate constraints, and generate search query
return Books.find(<search query>);
});
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
必须使用的方式?
答案 0 :(得分:0)
使用会话存储搜索约束并在tracker.autorun中订阅书籍,该书籍订阅会话更改的书籍。
Templae.yourTemplateName.onCreated(function(){
var self = this;
self.autorun(function(){
var searchQuery =Session.get("searchqery");
self.subscribe( 'Books',searchQuery)
})
})