2016-05-11 13 views
2

私は反応しない流星ヘルパーを持っています。 新しいキーがSessionに追加されたことを検出して、ヘルパーを再実行する方法を教えてください。流星:セッションキーを読み、反応する

'sessions': function() { // FIXME: not reactive 
    return _.keys(Session.keys).sort(); 
    } 

ありがとうございます! :)

を編集します。私はセッション自体が反応的であることを知っています。しかし、セッション辞書のキーはそうではありません。新しいセッションキーが追加されたことを検出できるようにしたいと思います。

+0

'Session.keys'はキーのみを返します。この場合、 '_.keys'は動作しません。テンプレートヘルパーと 'Session'はデフォルトで反応します。 –

+0

ありがとうございます。私はあなたが私の質問を誤解したと思う。セッション自体は反応的です。セッション辞書のキーはそうではありません。新しいセッションキーが追加されたことを検出できるようにしたいと思います。 – MickaelFM

+1

ReactDictの 'set()'メソッド(セッションはReactiveDictのインスタンスです)を特定の 'Tracker'計算を無効にして、あなたのヘルパーでその計算に依存させて(Monkey-Patchingによって) 。詳細については、[Tracker Manual](https://github.com/meteor/meteor/wiki/Tracker-Manual)を参照してください。 – MasterAM

答えて

1

Trackerを使用すると、これを実現できます。

は、ReactiveDictのインスタンスであり、すべてのキーに「購読する」方法がありません。

これを実装するには、元のset()メソッドをサルキーパッチでオーバーライドする必要があります。これを行うための

一つの方法は、全体のdictのためのトラッカーの依存関係を作成し、それをキーが設定されるたびに無効化することである:

import { Tracker } from 'meteor/tracker'; 
import { Session } from 'meteor/session'; 

const originalSet = Session.set; 
Session.keyDependendy = new Tracker.Dependency(); 

Session.set = function() { 
    originalSet.apply(this, arguments); 
    this.keyDependendy.changed(); 
} 

// in your helper 
'sessions': function() { 
    Session.keyDependendy.depend(); 
    return _.keys(Session.keys).sort(); 
} 

あなたはまた、ReactiveDictのプロトタイプにパッチを適用することによって、それがより一般的にすることができます。

+0

よく機能します、ありがとうございます! – MickaelFM

+0

私は上記のように、新しいキーのトラッカーを起動するだけでなく、両方が '.set()'を経由するので、既存のキーの変更を引き起こすと信じています。 –

+0

これは正しいです。新しいキーでのみトリガしたい場合は、 'typeof this.keys [key] === 'undefined''またはそれに類するものでなければ、依存関係を無効にする必要があります。' key'は 'set( ) '。 – MasterAM

関連する問題