mcw
mcw

Reputation: 545

Meteor subscriptions using deps

I'm trying to implement a searching feature in a Meteor application that re-subscribes/publishes a collection on every search, so there is only the exact Collection necessary in the client. I'm creating a reactive variable searchString, then changing it to the text in the search box on every search, then splitting the string into tags:

// 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();
    }
})

Then, publishing a new Collection on the server, based on the tags:

// Server
Meteor.publish('results', function(tags){
    regTags = _.map(tags, function(tag) { return new RegExp(tag)});
return Samples.find({tags: {$in: regTags}})
});

So I'm trying to match on regexes, but am having a weird issue where the subscription only changes when I add another tag, but changing existing tags fails.

So if the first searchString was tag1 and the second tag1 tag2, it works fine.

But if the first is tag1 and the second is tag2, the Collection doesn't update.

Any help is appreciated...I'm a beginner to Meteor, so if there is a better way to do what I'm trying to do, all suggestions are welcome. Thanks so much

Upvotes: 0

Views: 67

Answers (2)

rgoomar
rgoomar

Reputation: 184

A few things:

1) Meteor has a very nice way of setting up reactive variables with the ReactiveVar component. I would suggest using that rather than creating another dependency for a variable.

2) The name that you are subscribing to: results is different than what is published on the server sampleResults and that can cause issues.

3) If you are on Meteor >= 0.9.1 you should be using Tracker and not Deps. You can use Deps if you want, but the new updated API is Tracker and is probably more stable. See the changelog for more details on that.

4) You don't have to set your Deps.autorun function equal to a variable. So you can have it as:

Tracker.autorun(function() {
  // Code here
});

Upvotes: 0

sdooo
sdooo

Reputation: 1881

'change #search': function(){
   Meteor.subscribe('sampleResults', $('#search').val()); // or if you want on submit it's the same idea
}

and publish like

Meteor.publish('sampleResults, function(text){
   return Samples.find({tags: {$regex: text}});
}

Upvotes: 0

Related Questions