假设我有一个Meteor网站,我想要一个功能来搜索集合中的文档并将其显示给用户。
此集合非常大,无法将所有内容保留在客户端上。
我有一个发布语句,指定需要将哪些文档推送给用户。
Meteor.publish('listing', function (search) {
return TestObjs.find({"name": search });
});
我有一个搜索输入文本框,当它发生变化时,我想订阅该出版物以获取我需要的记录。
'change #searchText' : function(e,t){
Session.set("searchTerm", $("#searchText").val());
Meteor.subscribe("listing", $("#searchText").val());
}
因此,每次搜索文本时,客户端都会收到需要显示的文档。
问题是,订阅呼叫不会从客户端删除以前搜索术语的任何旧文档。所以第一个问题是用户使用搜索功能越多,将在客户端上存储的文档就越多。其次,如果我想显示当前搜索词的搜索结果,我不能只是去
Template.home.helpers({
listOfObjs: function () {
return TestObjs.find().fetch();
}
});
这将返回客户端上的所有记录,这些记录将是与当前和任何先前搜索词匹配的所有记录。
我必须复制发布声明
Template.home.helpers({
listOfObjs: function () {
return TestObjs.find({"name": Session.get("searchTerm") }).fetch();
}
});
这有效,但我基本上在多个地方重复逻辑。这只是一个简单的例子,但是如果我的搜索算法在分页等方面更复杂呢
所以我想知道,推荐的Meteor方法返回服务器上的集合的搜索结果是什么?
答案 0 :(得分:1)
不试试回答。希望你能找到这个。
var list;
'change #searchText' : function(e,t){
Session.set("searchTerm", $("#searchText").val());
if (list)
list.stop();
list = Meteor.subscribe("listing", $("#searchText").val());
}
来自doc
stop()
取消订阅。这通常会导致服务器指示客户端从客户端的缓存中删除订阅数据。