22

このコードが「0」と表示されるのはなぜですか? 「1」を返すべきではありませんか?

Messages = new Meteor.Collection("messages");

if (Meteor.is_client) {
    Meteor.startup(function () {    
        alert(Messages.find().count());
    });
}

if (Meteor.is_server) {
    Meteor.startup(function () {
        Messages.insert({text: "server says hello"});
    });
}

後で「Messages.find().count()」を実行すると、1 が返されます。

4

2 に答える 2

37

デフォルトでは、Meteorクライアントが起動すると、サーバーに接続し、Meteor.Collection定義した任意のドキュメントをサブスクライブします。サーバー接続の確立とドキュメントの受信には常にある程度の遅延があるため、完了するまでに時間がかかります。

Meteor.startup()クライアントでの操作はjQueryの場合とよく似$()ています。クライアントのDOMの準備ができると、引数が実行されます。クライアントのコレクションがサーバーからすべてのドキュメントを受信するのを待ちません。したがって、コードを記述した方法では、への呼び出しfind()は常に早すぎて0を返します。

コレクションがサーバーから最初にダウンロードされるまでコードの実行を待機する場合は、を使用Meteor.subscribe()してコレクションを明示的にサブスクライブする必要があります。 subscribe()ドキュメントの初期セットがクライアント上にあるときに実行されるコールバックを受け取ります。

見る:

meteor-publish およびmeteor-subscribe

于 2012-04-11T06:29:04.013 に答える
0

コレクションがクライアントでいつ使用できるようになるかを知る方法のコード例をフォローアップするだけです。

@debergalisが説明したように、 Meteor.subscribeアプローチを使用する必要があります。特に、いくつかのコールバックを受け入れます。onReady

例えば:

if(Meteor.isClient){

    Meteor.subscribe("myCollection", {

        onReady: function(){

            // do stuff with my collection

        }

    });

}
于 2016-05-26T01:12:22.040 に答える