MeteorJS:很难理解订阅/发布

时间:2014-03-17 19:51:56

标签: meteor

我有一个应用程序,可以在启动时加载Jobs集合。

Deps.autorun(function(){
  Meteor.subscribe('jobs', Session.get('currentIndustryOnet'));
});

我正在为Handlebars设置这样的工作:

Template.list.jobs = function() {
  var jobs;

  Deps.autorun(function(){
    if(Session.get('currentIndustryOnet')) {
      console.log(Jobs.find({onet: Session.get('currentIndustryOnet')}).count());
    }
  });

  if(Session.get('currentIndustryOnet')) {
    jobs = Jobs.find({onet: Session.get('currentIndustryOnet')});
  } else {
    jobs = Jobs.find({})
  }

  Session.set('jobCount', jobs.count());
  return Pagination.collection(jobs.fetch());
}

此外,Session.get('currentIndustryOnet')由下拉列表中的点击事件设置

我很困惑为什么你必须在模板中设置jobs,如果它在Deps.autorun中自动更新?

1 个答案:

答案 0 :(得分:1)

Meteor.subscribe('jobs', ...)要求服务器将一组作业文档发布到客户端数据库(minimongo),以便在模板中使用。 This blog post很好地解释了这是如何工作的。应该注意的是,字符串'jobs'不需要与集合有任何关系 - 它只是一个应该与服务器端的发布函数匹配的标识符。例如,它可能被称为'jobsForCurrentIndustryOnet'(这可能是一个更好的名字)。

订阅所需的数据库子集后,客户端将根据会话变量和Jobs.find调用的结果反复重绘模板中的作业。

请注意,模板助手应主要关注检索和操作数据。它们不应包括对订阅和自动运行的调用。在您的情况下,您应该删除Deps.autorun帮助程序内的jobs,因为每次autorun帮助程序评估时都会创建一个新的jobs(可能通常取决于如何你的反应变量正在发生变化。)