客户端上的Meteor.js集合为空

时间:2013-11-26 05:54:30

标签: javascript node.js mongodb meteor

为什么即使在myCollection.find().fetch()内进行调用,[]也会返回一个空数组if(data){...}if语句是否确保在执行console.log()之前已检索到该集合?

Template.chart.rendered = function() {

        var data = myCollection.find().fetch();

        if(data) {
            console.log(data);
        }

        $('#chart').render();

}

这将在浏览器Javascript控制台中返回[]

4 个答案:

答案 0 :(得分:6)

您可以使用count()代替返回结果的数量。 data本身就是一个空数组[],它不是假的([] == true)。

除非您要使用原始数据,否则请勿使用fetch(),因为它非常费力。如果需要,您可以使用.forEach循环播放它。

var data = myCollection.find();

if(data.count())
  console.log(data);

//If you need it for something/Not sure if this is right but just an example
$('#chart').render(data.fetch())

答案 1 :(得分:2)

问题是您必须等待来自服务器的数据。当您只使用Template.name.rendered函数时,会立即调用它。您必须使用Template.name.helpers函数来等待来自服务器的数据。 documentation

中描述了所有内容

答案 2 :(得分:2)

当你"删除自动发布"你还必须在客户端订阅。

  if(Meteor.isClient) {
    Meteor.startup(function() {
      Myvars = new Mongo.Collection("myvars");
      Meteor.subscribe('myvars')
    });
  }

并在服务器上启用允许和发布

  if(Meteor.isServer) {
    Meteor.startup(function () {
      Myvars = new Mongo.Collection("myvars");
      Myvars.allow({
        insert: function () {
          return true;
        },
        update: function () {
          return true;
        },
        remove: function () {
          return true;
        }
      });
      if (Myvars.find().count() == 0) {
        Myvars.insert({myvalue:'annoyed'});
      }

      Meteor.publish("myvars", function() {
        return Myvars.find();
      });
    });
  }

我也对此感到陌生。我只是希望拥有一个所有客户都可以分享的全球价值。看起来像一个有用的想法(从初学者的角度来看)和代表Meteor团队的完全监督,它没有以这种方式清楚地记录。我还不知道什么允许获取,在官方文档中也完全不清楚。

答案 3 :(得分:1)

确实如此,但在javascript中你有以下奇怪的行为

if ([]){
  console.log('Oops it goes inside the if')
} // and it will output this, nontheless it is counter-intuitive

这是因为JS引擎将Boolean([])强制转换为true。您可以使用casted to Boolean here的不同类型。

检查您的数组在开头是否为空。

a = [];
if (a.length){
  //do your thing
}