使用服务器方法更新反应式var

时间:2017-05-22 09:06:18

标签: javascript asynchronous meteor

我在客户端更新Meteor应用程序中的某些值时遇到问题。我试图了解ReactiveVar的工作原理。 当我在客户端对集合使用find()方法时,每次更改内容时网站都会立即更新。我想使用ReactiveVar和服务器端方法实现相同的效果。所以下面的代码对我来说正常工作:

// Client
Template.body.onCreated(function appBodyOnCreated() {
  this.subscribe('activities');
}

Template.body.helpers({
  getCounter() {
    return Activities.find({
       editorId: Meteor.userId(),
       'referredObject.type': 'LIST'
   }).count();
}
});

但是当我尝试使用服务器端方法实现相同的效果时,它无法正常工作。下面的代码只更新变量一次。如果我想获得当前值,我需要刷新页面。

// Server
Meteor.methods({'activitiesCreateCount'(userId, objectType) {
    check(userId, String);
    check(objectType, String);
    return Activities.find({
        editorId: userId,
        'referredObject.type': objectType
    }).count();
} 
});

// Client

Template.body.onCreated(function appBodyOnCreated() {
  this.subscribe('activities');
  this.activitiesAmount = new ReactiveVar(false);
}

Template.body.helpers({
  getCounter() {
    var tempInstance = Template.instance();
    Meteor.call('activitiesCreateCount', Meteor.userId(), 'TODO', function(err, response) {
      tempInstance.activitiesAmount.set(response);
    });
    return Template.instance().activitiesAmount.get();
}
});

如果我想要总是拥有变量的当前值(如在第一个仅客户端的示例中),我如何改进我的代码?

1 个答案:

答案 0 :(得分:-2)

尝试将Meteor.call移至Template.body.onCreated 像这样的东西

  // Server
  Meteor.methods({'activitiesCreateCount'(userId, objectType) {
      check(userId, String);
      check(objectType, String);
      return Activities.find({
          editorId: userId,
          'referredObject.type': objectType
      }).count();
  } 
  });

  // Client

  Template.body.onCreated(function appBodyOnCreated() {        
    self = this;
    this.activitiesAmount = new ReactiveVar(false);
    Meteor.call('activitiesCreateCount', Meteor.userId(), 'TODO', function(err, response) {
      self.activitiesAmount.set(response);
    });
  }

  Template.body.helpers({
    getCounter() {
      return Template.instance().activitiesAmount.get();
  }
  });