4

Meteor を使用して webapp を作成しようとしていますが、公開されたデータセットのサブスクライブについて何かを理解できていません。アプリ全体はgithubにアップされています (後世のために最新のコミットにリンクされています) が、以下に要約してみます。

クライアントとサーバーの両方で利用できるチームと呼ばれるコレクションがあります。

Teams = new Meteor.Collection( "teams" );

サーバー上で、すべてのチームのリストを公開したいと考えています。

Meteor.publish( "allteams", function() { ...

この公開リストを構成する非常に単純なカーソルがあります。

var handle = Teams.find( {} ).observeChanges({
    added: function( id ) {
        console.log( "New team added" );
        if ( !initializing ) {
            console.log( "Telling subscribers it's all change" );
            self.added( "teams", id, {} );
            self.ready();
        }
    }
});

クライアントはそのソースをサブスクライブし、要素が追加されると、クライアントはピンをマップに追加します。

Meteor.autorun( function() {
    Meteor.subscribe( "allteams", function() {
        console.log( "All teams has been updated" );
        // Do more stuff
    }
};

リストが最初に読み込まれると、自動実行は正常に実行されますが、コレクションに別の要素を追加すると、パブリッシャー メソッドは「これに気づきました」とログに記録しますが、サブスクライバーでは何も起こりません。

上記の目的は次のとおりです。

  • サーバーには、名前と経度/緯度の詳細で構成されるチームのリストがあります
  • クライアントが接続すると、チームのリストを受け取り、マップにプロットされます
  • チームがサーバー側のリストに追加されると、各クライアントに通知され、新しいピンがマップに表示されます。

アプリに関して言えば、魔法のようにピンを表示する必要はないかもしれませんが、特にピンが正しくない場合は、パブリッシュとサブスクライブを学習するのに便利な方法です! 最終的には、「allteams」はおそらくチームのリスト全体よりももう少し細かいものになるので、データのビューを作成することに似ていると思います.

完全に明らかな何かが欠けていますか?

編集:私はそれを解決し、答えを下に置きました。tl;dr 私はリアクティブなデータ ソースをまったく購読していませんでした。

4

2 に答える 2

13

私自身の質問に答えるのはおそらく礼儀正しくありませんが、私は自分が間違っていたことを解決し、他の人が同じことに遭遇する可能性があると考えました.

簡単な答えは、質問のタイトルで行っていると主張したこと、具体的には、リアクティブなデータ ソースを購読していないことです。

Meteor.autorun( function() {
    Meteor.subscribe( "allteams", function() {
        console.log( "All teams has been updated" );
        // Do more stuff
    }
};

ここでは にsubscribeメソッドを渡しましたautorunが、そのメソッド自体はリアクティブ データ ソースではありません。しかし、それはあるものを返します!

// Define a subscription
var handle = Meteor.subscribe( "foo", { onReady: function() { ... } } );

Meteor.autorun( function() {
    if ( handle.ready() ) {
        // Now do something every time the subscription is marked as ready
    }
};

サブスクリプション ハンドルのreadyメソッドはリアクティブであるため、公開されたドキュメント セットが更新されるたびに自動実行が実行されるようになりました。これにより、複数のクライアントがデータベース カーソルをサブスクライブして変更を監視する効率についてさらに疑問が生じますが、それについては別の質問で説明します。

于 2013-03-16T09:42:11.140 に答える