使用deps的Meteor订阅

时间:2015-01-05 00:23:08

标签: regex meteor

我正在尝试在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的初学者,所以如果有更好的方法来做我想做的事情,欢迎提出所有建议。非常感谢

2 个答案:

答案 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
});