14

我想在页面加载后尽快执行 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)。

4

6 回答 6

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请从根项目目录对每个项目执行。

于 2013-02-28T09:31:36.537 回答
8

使用DDP._allSubscriptionsReady()(流星 0.7)

于 2013-12-27T15:29:13.543 回答
6

从 Meteor 1.0.4 开始,有一个助手可以准确地告诉您特定订阅何时准备就绪:Template.instance().subscriptionsReady().

由于这个问题是重复的,请检查我在原始问题中的回答,Displaying loader while meteor collection loading

于 2015-04-05T19:50:56.943 回答
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}} 加载屏幕可能是
{{/if}}

于 2016-04-21T03:04:20.077 回答
0

如果您知道您的 Games 集合永远不会为空,您可以检查最终返回结果的时间:

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>
于 2013-02-28T11:39:42.710 回答
0

对于那些可能正在使用用户 ID 或存储在 Meteor.users 数据库中的用户信息的某些部分的人来说,这是另一个信息。当页面第一次加载 Meteor 订阅时,在后台继续进行,它本身可能不完整。因此,当您尝试连接到另一个数据库进行查询时,它不会提取信息。这是因为Meteor.user()仍然是 null 本身;

原因,如上所述,是因为实际的 Meteor 用户集合尚未通过拉取数据。

处理这种情况的简单方法。

Meteor.status().connected

这将返回 true 或 false,让您知道Meteor.user集合何时准备就绪。然后你就可以继续你的业务了。

我希望这对某人有所帮助,我正要拔出头发试图弄清楚如何检查状态。那是在弄清楚 Meteor 用户集合本身尚未加载之后。

于 2016-04-21T00:57:39.397 回答