假设我有一个 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 方式是什么来返回服务器上集合的搜索结果?
最佳答案
不试就回答。希望您正在寻找这个。
var list;
'change #searchText' : function(e,t){
Session.set("searchTerm", $("#searchText").val());
if (list)
list.stop();
list = Meteor.subscribe("listing", $("#searchText").val());
}
来自doc
stop()
取消订阅。这通常会导致服务器指示客户端从客户端缓存中删除订阅的数据。
关于javascript - Meteor 中用于搜索和显示文档的标准模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32071522/