Javascript 使用服务器方法更新被动var

Javascript 使用服务器方法更新被动var,javascript,asynchronous,meteor,Javascript,Asynchronous,Meteor,我在客户端更新Meteor应用程序中的一些值时遇到问题。我想了解ReactiveVar是如何工作的。 当我在客户端的集合上使用find方法时,每当我更改某些内容时,站点都会立即更新。我希望使用ReactiveVar和服务器端方法实现相同的效果。因此,下面的代码对我来说是正确的: // Client Template.body.onCreated(function appBodyOnCreated() { this.subscribe('activities'); } Template.bo

我在客户端更新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();
}
});
如果希望始终像第一个仅客户端示例中那样拥有变量的当前值,如何改进代码?

尝试将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();
  }
  });
尝试将Meteor.callto移动到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();
  }
  });

它按预期的方式工作。如果你有一个可行的解决方案,为什么你不想使用它呢?假设我有一个复杂而耗时的任务。如果一个用户更改了某些内容,它将触发此复杂任务,并且结果应在另一个特定用户屏幕上更新。我不确定在客户端执行这项复杂的任务是否是一个好主意,所以我正在尝试寻找另一种解决方案。如果这项想象中的复杂而耗时的任务改变了某些集合中某些文档的某些值,只需订阅它,您就可以始终保持最新。若要减少发送到客户端的数据量,请使用字段。如果仍要使用该方法,则应定义重新运行该方法的条件。如果你把它放在助手中,也把一些反应性数据源放在那个助手中,这样当这个反应性数据源改变时,助手就会重新运行。它按照它应该工作的方式工作。如果你有一个可行的解决方案,为什么你不想使用它呢?假设我有一个复杂而耗时的任务。如果一个用户更改了某些内容,它将触发此复杂任务,并且结果应在另一个特定用户屏幕上更新。我不确定在客户端执行这项复杂的任务是否是一个好主意,所以我正在尝试寻找另一种解决方案。如果这项想象中的复杂而耗时的任务改变了某些集合中某些文档的某些值,只需订阅它,您就可以始终保持最新。若要减少发送到客户端的数据量,请使用字段。如果仍要使用该方法,则应定义重新运行该方法的条件。如果您将其放在帮助程序中,还可以将一些反应性数据源放在该帮助程序中,这样当此反应性数据源更改时,帮助程序将重新运行。它也只运行一次。它也只运行一次。