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 に答える
6

Meteor 1.0.4 の時点で、特定のサブスクリプションの準備が整ったときに正確に通知するヘルパーがあります: Template.instance().subscriptionsReady().

この質問は重複しているため、元の質問の私の回答を確認してください。流星コレクションの読み込み中にローダーを表示する.

于 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

Meteor.users データベースに保存されているユーザー ID またはユーザー情報の一部を使用している可能性がある人のための別の情報を次に示します。ページが最初に Meteor サブスクライブをロードするときは、バックグラウンドで進行しているため、それ自体が完了していない可能性があります。そのため、別のデータベースに接続してクエリを実行しようとしても、情報は取得されません。これは、Meteor.user()自体がまだ null であるためです。

その理由は、前述のように、実際の Meteor ユーザー コレクションがデータを取得していないためです。

これに対処する簡単な方法。

Meteor.status().connected

Meteor.userこれは true または false を返し、コレクションの準備が整ったことを知らせます。その後、あなたはあなたのビジネスについて続けることができます。

これが誰かの役に立てば幸いです。ステータスを確認する方法を見つけようとして、髪を引っ張ろうとしていました。それは、Meteor ユーザー コレクション自体がまだロードされていないことがわかった後でした。

于 2016-04-21T00:57:39.397 に答える
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 に答える