为什么即使在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控制台中返回[]
。
答案 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
}