如果数据库变量已更改 Meteor,则重新加载页面内容

Reload page content if database variable has changed Meteor

我正在开发 meteor 应用程序。我想在数据库变量更改时重新加载客户端的内容。我正在使用发布订阅。如果状态变量已更改,我想加载内容。

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")
        }
})

autorun 将不会重新计算,直到反应数据发生更改并且在计算中请求此更改。虽然订阅是一个反应源,但您还需要检查它是否准备就绪,从而导致新的计算周期:

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
      }
    }
}

您可以在 onCreated 函数中使用 Tracker 或者您可以尝试通过助手填充数据。

import { Tracker } from 'meteor/tracker';

Tracker.autorun(() => {
 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")
        }
});