我正在尝试在Meteor应用程序中实现搜索功能,该功能在每次搜索时重新订阅/发布集合,因此客户端中只有必需的精确集合。我正在创建一个反应变量searchString
,然后在每次搜索时将其更改为搜索框中的文本,然后将该字符串拆分为标记:
// Client
var searchString = "";
var searchStringDep = new Deps.Dependency;
var getSearchString = function(){
searchStringDep.depend();
return searchString;
}
var handle = Deps.autorun(function(){
var tags = getSearchString().split(" ");
tags = _.map(tags, function(tag){
return tag.replace(/[^\w]/g, "");
}).filter(function(t){
return t.toLowerCase();
});
Meteor.subscribe('results', tags);
});
Template.library.events({
'submit form': function(ev){
ev.preventDefault();
searchString = ev.target.search.value;
searchStringDep.changed();
}
})
然后,根据标记在服务器上发布新的集合:
// Server
Meteor.publish('results', function(tags){
regTags = _.map(tags, function(tag) { return new RegExp(tag)});
return Samples.find({tags: {$in: regTags}})
});
所以我试图在正则表达式上进行匹配,但我遇到一个奇怪的问题,即当我添加另一个标记时,订阅只会更改,但更改现有标记会失败。
因此,如果第一个searchString是tag1
而第二个是tag1 tag2
,那么它可以正常工作。
但如果第一个是tag1
而第二个是tag2
,则收藏不会更新。
感谢任何帮助...我是Meteor的初学者,所以如果有更好的方法来做我想做的事情,欢迎提出所有建议。非常感谢
答案 0 :(得分:0)
'change #search': function(){
Meteor.subscribe('sampleResults', $('#search').val()); // or if you want on submit it's the same idea
}
并发布如
Meteor.publish('sampleResults, function(text){
return Samples.find({tags: {$regex: text}});
}
答案 1 :(得分:0)
一些事情:
1)Meteor有一种非常好的方法来设置ReactiveVar
组件的反应变量。我建议使用它而不是为变量创建另一个依赖项。
2)您订阅的名称:results
与服务器sampleResults
上发布的名称不同,可能会导致问题。
3)如果你使用Meteor> = 0.9.1,你应该使用Tracker
而不是Deps
。如果需要,您可以使用Deps
,但新更新的API为Tracker
且可能更稳定。有关详细信息,请参阅changelog。
4)您不必将Deps.autorun函数设置为等于变量。所以你可以把它作为:
Tracker.autorun(function() {
// Code here
});