从渲染事件访问时,集合为空?

时间:2016-02-09 02:32:54

标签: javascript node.js mongodb meteor

我有一个我订阅的集合,但是当我尝试从我的onRendered事件中访问它时,它总是返回一个空数组。以下是我使用的方法:

FlightCounts = new Mongo.Collection("flightCounts");

if (Meteor.isClient) {
  Meteor.subscribe('flightCounts');
  Template.hello.rendered = function(){
    var counts = FlightCounts.find().fetch()
    console.log(counts)
  }

}

if (Meteor.isServer) {
  Meteor.startup(function () {
    // code to run on server at startup
    Meteor.publish('flightCounts', function(){
      return flightCounts.find();
    })
  });
}

任何人都可以看到为什么我的收藏品总是空着的?有关如何填充它的任何建议吗?

3 个答案:

答案 0 :(得分:2)

if (Meteor.isClient) {
    Meteor.subscribe('flightCounts');
    Template.hello.rendered = function() {
        var template = this;
        template.autorun(function () {
             var counts = FlightCounts.find().fetch()
             console.log(counts)
        });
    }
 }

您的集合未填充,因为它仍然从服务器获取数据。因此,您应该将代码包装在自动运行中,以便在数据更新时重新运行。

P.S:我在移动设备上,因此格式化可能不合适。对不起。

答案 1 :(得分:2)

根本问题是发布功能应引用Meteor的Mongo.Collection名称FlightCounts,而不是原始db.collection名称flightCounts

Meteor.publish('flightCounts', function(){
  return FlightCounts.find();
});

我同意先前的答案,您的模板应该在记录数据之前检查以确保订阅准备就绪,否则它可能尚未到达:

Template.hello.onRendered(function(){
  this.autorun(() => {
    let ready = Template.instance().subscriptionsReady();
    if (!ready){ return; }
    let counts = FlightCounts.find().fetch();
    console.log(counts);
  });
});

(请注意,Template.name.rendered的较新语法为Template.name.onRendered()。)

答案 2 :(得分:1)

或者,您可以使用subscriptions的{​​{1}}或FlowRouter的{​​{1}}来订阅

更新令人惊讶的是,waitOn现在还有IronRouter选项