我有一个基于流星排行榜示例的测试应用程序,但是当我创建自己的应用程序时,我无法显示数据,查询也无法正常工作。如果我在终端窗口中运行meteor mongo,我可以看到有数据被插入。
db.games.find();
显示所有游戏。
db.games.remove();
删除所有游戏,但不能在我的流星应用程序内部工作。
除插入内容外,此应用程序中没有任何内容可用。
if (Games.find().count() === 0)
总是返回零。
这是我的main.js文件。
var court = 1;
var currentDate = new Date;
var gameDate = new Date("2014-10-19");
var gameTime = new Date("21:15");
var MinutesSinceMidnightNow = (new Date() - new Date().setHours(0,0,0,0)) / 6000;
var MinutesSinceMidnightGameTime = (new Date().setHours(21,15,0,0) - new Date().setHours(0,0,0,0)) / 6000;
Games = new Meteor.Collection("games");
if (Meteor.isClient) {
Template.game.helpers({
games: function () {
return Games.find({});
} // players func
}); //template helpers
Meteor.startup(function () {
if (Games.find().count() === 0) {
Games.insert({
"court_id": court,
"game_date": gameDate,
"court_name": 'Court 1',
"game_time" : gameTime,
"team_a": "bulldogs",
"team_b": "sea eagles",
"team_a_score": 0,
"team_b_score": 0,
"game_duration": 75,
"game_half": 0,
"game_quarter": 15,
"quarter_time": 3,
"half_time": 5,
"game_minutes": MinutesSinceMidnightGameTime
});
}
});
} // isClient
if (Meteor.isServer) {
Meteor.startup(function () {
Games.remove();
});
}
这是我的HTML文件。
<head>
<meta name="viewport" content="width=device-width, user-scalable=no">
</head>
<body>
<div class="outer">
{{> scoresheet}}
</div>
</body>
<template name="scoresheet">
<div class="scoresheet">
{{#each games}}
{{> game}}
{{/each}}
</div>
</template>
<template name="game">
<div class="game">
<h1>"Hello"</h1>
<span class="name">{{game_time}}</span>
<span class="name">{{court_name}}</span>
<span class="name">{{team_a}}</span>
<span class="name">{{team_b}}</span>
<span class="score">{{team_a_score}}</span>
<span class="score">{{team_b_score}}</span>
</div>
</template>
答案 0 :(得分:0)
你正在陷入竞争状态......
在声明集合Games.find()
之后但在集合Games
同步之前,查询Games
正在运行,因此即使 n <,答案也将为0 / em>&gt; 0
您可以通过在应用程序完全加载时在控制台中运行Games.find().count()
来测试是否是这种情况。它应该打印 n 。
当您希望集合中有文档时,解决方案是将其包装在autorun
Meteor.autorun(function() {
if(Games.findOne()) {
//do your stuff here
}
});
但是对于 n = 0
的情况,这仍然会失败因此您可以将其放入计时器并测试DDP._allSubscriptionsReady()
timer = Meteor.setInterval( function(){test();}, 200 );
test = function(){
if(DDP._allSubscriptionsReady()) action(timer);
};
action = function(timer){
Meteor.clearInterval(timer);
/* now do stuff */
console.log('subs are ready, really ready', Games.find().count())
};
但是,在实际情况中,您应该考虑删除autopublish
包并设置发布/订阅,并根据this answer