1

meteor と MeteorStreams に基づくシンプルなアプリに取り組んでいます。目的は単純です: 1 人のユーザーがボタンをクリックしてルームを作成します 他のユーザーがルームに参加します これらのユーザーは単純なメッセージでストリームを送信できます 作成者はそのメッセージを聞いて表示します

実際、他のユーザーからのメッセージは送信されますが (サーバー スクリプトにログイン)、作成者はそれらを受信しません。作成者のページをリロードすると、他のユーザーから送信されたメッセージが表示されます。

なぜそれが初めてうまくいかないのか、私にはよくわかりません。

ルーティング システムに meteor-router を使用しています。コードはここで見ることができます

https://github.com/Rebolon/MeetingTimeCost/tree/feature/pokerVoteProtection

クライアント側のコードは client/views/poker/* にあり、サーバー ストリームのコードのクライアント/ヘルパーは server/pokerStreams.js にあります。

アプリケーションはここでテストできます: http://meetingtimecost.meteor.com 作成者はログインする必要があります。

アイデアがあれば、どんな助けでも大歓迎です。ありがとう

4

1 に答える 1

2

わかりました、わかりました、デバッグを行った後、コードの何が問題なのかがわかりました。実際には簡単です。この問題は、Stream.on イベントを Deps.autorun にバインドするのを忘れたことが原因です。その結果、コードのこの部分はリアクティブによって管理されていなかったため、セッションが変更されたときに自動的に再実行されることはありませんでした。

解決策は Meteor でとても簡単です: コードのこの部分を Deps.autorun 内にラップするだけです

Meteor.startup(function () {
  Deps.autorun(function funcReloadStreamListeningOnNewRoom () {
    PokerStream.on(Session.get('currentRoom') + ':currentRoom:vote', function (vote) {
      var voteFound = 0;
      // update is now allowed
      if (Session.get('pokerVoteStatus') === 'voting') {
        voteFound = Vote.find({subscriptionId: this.subscriptionId});
        if (!voteFound.count()) {
          Vote.insert({value: vote, userId: this.userId, subscriptionId: this.subscriptionId});
        } else {
          Vote.update({_id: voteFound._id}, {$set: {value: vote}});
        }
      }
    });
  });
});

つまり、これは Meteor Streams の問題ではなく、私のせいです。反応性が必要な場合は、テンプレートとコレクションの外でコードを Deps 内にラップする必要があることを人々が理解するのに役立つことを願っています。

于 2013-08-02T07:05:19.010 に答える