我希望在页面加载后尽快执行Meteor集合查询。我尝试的第一件事是这样的:
Games = new Meteor.Collection("games");
if (Meteor.isClient) {
Meteor.startup(function() {
console.log(Games.findOne({}));
});
}
这不起作用(打印“未定义”)。从JavaScript控制台调用时,几秒钟后相同的查询工作。我假设在数据库准备好之前存在某种延迟。那么如何判断此查询何时成功呢?
OSX 10.8和Chrome 25下的Meteor版本0.5.7(7b1bf062b9)。
答案 0 :(得分:17)
您应首先publish
来自服务器的数据。
if(Meteor.isServer) {
Meteor.publish('default_db_data', function(){
return Games.find({});
});
}
在客户端上,仅在从服务器加载数据后才执行收集查询。这可以通过在subscribe
调用中使用被动会话来完成。
if (Meteor.isClient) {
Meteor.startup(function() {
Session.set('data_loaded', false);
});
Meteor.subscribe('default_db_data', function(){
//Set the reactive session as true to indicate that the data have been loaded
Session.set('data_loaded', true);
});
}
现在,当您执行集合查询时,您可以检查数据是否已加载:
if(Session.get('data_loaded')){
Games.find({});
}
注意:删除autopublish
软件包,默认情况下会将您的所有数据发布到客户端,这是不好的做法。
要删除它,请在根项目目录中的每个项目上执行$ meteor remove autopublish
。
答案 1 :(得分:8)
使用DDP._allSubscriptionsReady()
(流星0.7)
答案 2 :(得分:6)
从Meteor 1.0.4开始,有一个帮助器可以准确地告诉您特定订阅的准备时间:Template.instance().subscriptionsReady()
。
由于此问题是重复的,请在原始问题Displaying loader while meteor collection loads中查看我的答案。
答案 3 :(得分:1)
您还可以进行模板级订阅:
Template.name.onCreated(function(){
var self = this;
this.autorun(function(){
const db = this.subscribe('publicationname', [,args]);
if(db.isReady()){
"You'll know it's ready here" .. do what you need.
}
});
})
这样也可以更容易地了解模板内部。你可以打电话
{{#if Template.subscriptionsReady}}
{{else}}加载屏幕可能是
{{/如果}} 强>
答案 4 :(得分:0)
如果您知道您的游戏集合永远不会为空,您可以检查何时最终返回结果:
Meteor.autorun(function() {
if(Games.findOne() && !Session.get("loaded")) {
Session.set("loaded",true);
//Its ready..
console.log(Games.findOne({}));
}
});
您也可以在模板中使用它:
客户js:
Template.home.isReady = function() { return Session.get("loaded") };
HTML
<template name="home">
{{#if isReady}}
Yay! We're loaded!!
{{else}}
Hold an a second
{{/if}}
</template>
答案 5 :(得分:0)
以下是可能正在使用存储在Meteor.users数据库中的用户ID或部分用户信息的人的另一些信息。当页面首次加载Meteor订阅时,在后台继续,可能不会完成。因此,当您尝试连接到另一个数据库以查询它时,它将不会提取信息。这是因为Meteor.user()
本身仍为空;
原因如上所述,是因为实际的Meteor用户收集还没有通过提取数据。
处理此事的简单方法。
Meteor.status().connected
这将返回true或false,以便在Meteor.user
集合准备就绪时通知您。然后你可以继续你的业务。
我希望这对某人有所帮助,我正要试着弄清楚如何检查状态。那是在弄清楚Meteor用户集合本身尚未加载之后。