Search code examples
node.jsmeteormeteor-blaze

Reload page content if database variable has changed Meteor


I am working on meteor app. I want to reload the content of the client when the database variable has changed. I am using pub-sub. I want to load content if the status variable has changed.

Meteor.publish('activities', function(loggedInUserToken) {
    var authObj = AuthenticationToken.findOne({ authToken: loggedInUserToken });
    if (authObj) {
        var userObj = Users.findOne({ _id: authObj.user_id });
        var activities = Activities.find({}, { sort: { createdAt: -1 } });
        return activities;
    }
    return this.ready();
});


Template.masterSku.onCreated(function() {
    var instance = this;
    instance.autorun(function() {
        var loggedInUserToken = "xxxxxxxxxxxxxxxx"
        statusSuscription = instance.subscribe("activities", loggedInUserToken);
        var activitiesObj = Activities.findOne({}, { sort: { createdAt: -1 } })
        if (activitiesObj && activitiesObj.status == "true") {
            console.log("Status Changed load Content accordingly")
        }
})

Solution

  • The autorun will not recompute until a reactive data has changed AND this change is requested within the computation. While a subscription is a reactive source, you also need to check for it's readyness and thus cause a new computation cycle:

    instance.autorun(function() {
        var loggedInUserToken = "xxxxxxxxxxxxxxxx"
        var statusSuscription = instance.subscribe("activities", loggedInUserToken);
        if (statusSuscription.ready()) { // causes a new compuation by the Tracker
          var activitiesObj = Activities.findOne({}, { sort: { createdAt: -1 } })
          if (activitiesObj && activitiesObj.status == "true") {
            console.log("Status Changed load Content accordingly")
            // here you can insert data into a ReactiveVar or ReactiveDict and use
            // result in a Template helper, which itself will cause your Template to re-render
          }
        }
    }