2017-04-26 8 views
0

collection.observeChangesを使用して新しいレコードがコレクションに追加されるたびに、次のコードに示すようにメッセージを表示しようとしていますが、アプリケーションが読み込まれると、無限ループ下のようにコンソールメッセージが表示されますので、誰かが私がここで紛失していることを教えてください。また、新しいレコードがコレクションに追加されたときにのみ「追加」メッセージを表示するように修正できますか?ありがとうMeteor collection observeChanges無限ループを引き起こす

Template.homePage.helpers({ 
    'notifications'() { 
    let userNotCol = userNotCol.find({ userID: Meteor.userId(), read: false }); 
    userNotCol.observeChanges({ 
     added: function(id, fields){ 
     if(!fields.read){ 
      console.log('added'); // This enters in infinite loop 
     } 
     } 
    }); 
    return userNotCol; 
    } 
}); 
+0

カーソルが最初に返すドキュメントの数はいくつですか? – ghybs

+0

@ghybs約。 19 – MChan

答えて

1

私はヘルパーで観察しないことをお勧めします。ヘルパーは、テンプレートレンダリングデータを支援することを目的としています。そこにはどんなロジックも存在するはずです。ヘルパーは何度も呼び出すことができますが、それはあなたが期待していないかもしれません。

テンプレートのonCreated()でfind()とobserve()を設定できます。テンプレートがアクティブな間にユーザーの変更が必要な場合は、自動実行ブロックでfind()およびobserve()をラップすることができます。

追加されたハンドラが呼び出されると、結果を反応性のあるvarに設定できます。あなたのヘルパーは、その反応変数の値を返す以外に何もする必要はありません。

0

これは、物事をクリアするのに役立ちます。 docsから:

observeChanges stopメソッドを持つオブジェクトであるライブクエリーのハンドルを返します。引数なしでコールを停止してコールバックの呼び出しを停止するには、 関数を呼び出してクエリを破棄します。クエリは、これを呼び出すまで まで永遠に実行されます。 observeChangesがTracker.autorun の計算から呼び出された場合、計算が再実行されると自動的に停止し、 または停止します。 (カーソルが falseにオプション反応セットで作成された場合、それが唯一の最初の結果をお届けしますし、任意の さらにコールバックを呼び出すことはありません;ハンドルを停止呼び出す必要はありません)

そして、問題は無限ループではなく、クエリが永遠に実行されるか、stopが呼び出されるまで実行されます。

関連する問題