Search code examples
javascriptsessionmeteorroutesiron-router

Session variable not updating when going to a specific route


I'm doing something wrong while setting Session variables and handling the Router

main.js:

Template.global.onCreated(function(){
    Session.setDefault("musicFilteredCategory", "latest")
});

router.js:

Router.route("/music/:category?", {
    name: "music",
    template: "music",
    beforeAction: function () {
        var category = this.params.category;
        Session.set("musicFilteredCategory", category);
    }
});

but when I open page "/music/latin-radio" and I check Session.get("musicFilteredCategory") I get "latest" instead of "latin-radio"

later I changed Session.setDefault("musicFilteredCategory", "latest") to outside the Template.global.onCreated({}) and the result is still the same.

What should be the best practice to do this?

I also want to add this feature once this is fixed: when the user goes to "/music" to be redirected to "/music/:defaultMusicCategory"

PS: I'm using Meteor 1.2.0.1 & Iron Router 1.0.9


Solution

  • As @Kyll pointed out I should use onBeforeAction for the function to run.

    This solved part of my problem, but the categories were not being changed when accessing the different routes.

    Here's what I had to do:

    Router.route("/music/:category?", {
        name: "music",
        template: "music",
        onBeforeAction: function () {
            var category = this.params.category;
            if (category !== "undefined") {
                Session.set("musicFilteredCategory", category);
            }
            this.render("music");
        }
    });
    

    This doesn't cover the route "/music" (without the slash) so I also had to add this route, I placed it before the code above

    Router.route("/music", {
        name: "music",
        template: "music"
    });
    

    To resolve this I had to move the Session.setDefault() outside the templates scope as they were overriding the Session established on the router, so I had to put them inside a Meteor.startup function

    Meteor.startup(function () {
        Session.setDefault("musicFilteredCategory", "latest");
    });