1

Meteor.subscribeonReadyのコールバックで問題が発生しました。呼び出されると、次のようにドキュメントに記載されています。サブスクリプションは完了としてマークされています。ただし、変更中のコレクションは、最後のサブスクリプション間の差異の処理を完了していない場合があります。

Todos の例を変更すると、簡単なデモを見ることができます。

$ meteor create --example todos

Edit client/todos.js、34 行目を参照してください。autosubscribe ブロックを次のように置き換えます。

Meteor.autosubscribe(function () {
  var list_id = Session.get('list_id');
  var onReady = function (done) {
    var list, todos = Todos.find();
    if (todos) {
      list = todos.map(function (todo) {
        return todo.text;
      });
      if (done) {
        console.log("subscription onReady called again 100ms later:", list);
      } else {
        console.log("subscription onReady called:", list);
        setTimeout(function () {
          onReady(true);
        }, 100);
      }
    }
  };
  if (list_id)
    Meteor.subscribe('todos', list_id, onReady);
});

例を起動し、コンソールを見ながら、1 つの Todo リストから別の Todo リスト (左上を参照) をクリックします。onReadyが呼び出されると、コレクションには、新しく選択された Todo リストと連結された以前の Todo リストの両方のドキュメントが含まれていることがわかります。

これは実際にはバグではありません。これは、コレクションが最新のonReady場合に起動されることを暗示していませんが、サブスクリプションが完了した場合に限られます。

これにアプローチするための提案はありますか?サブスクリプション後にコレクションが最新の状態になったらすぐに通知を受ける方法はありますか? 私は頼るべきだろうか.observe...しかし、クライアントに?それはクライアント側で利用できますか?明日これを試すかもしれませんが、解決策を聞きたいです

参考までに: 私の使用例は、先行入力 Bootstrap JS pluginを中心に展開しています。サーバーへの検索クエリを使用してサブスクリプションを開始しています。サーバーは検索結果を公開し、クライアントがこのデータを受信するとすぐに (onReady が正しい選択であると期待していました...)、先行入力ソースの入力/更新に進みます。

4

1 に答える 1

0

ここで同様の質問をしました:メテオのサブスクリプションが「有効」であることを知る方法はありますか?

要するに、何が起こっているかについてあなたは正しいです。答えは、Todos使用時にコレクションを適切にフィルタリングすることです。

Template.foo.todos = function() { 
  return Todos.find({list_id: Session.get('list_id')});
}
于 2012-08-06T23:19:34.617 に答える