2012-04-12 13 views
5

保存:コーヒースクリプトクラスのコンテキストと共通する問題へのエレガントな解決策を探してイベントコンテキスト

私はいくつかのイベントをサブスクライブクラスを得たが、私はハンドラが私のクラス内のインスタンスメソッドになりたいです、イベントコンテキスト(このケースではイベントが発生した要素)を取得したいと考えています。

私はメソッド定義に太い線の構文を使用していますが、イベントコンテキストを取得する方法はありません。具体的には、私はraphael jsを使用しています。要素にサブスクライブするとき、イベントオブジェクトには要素が含まれていません。イベント要素がないので、dom要素のみが要素内を検索する必要があります。それが好きではありません。

この場合のベストプラクティスは何ですか?私は現在、イベントに登録するたびに新しいコンテキストオブジェクトを作成しています。コンテキストにはインスタンス参照と要素参照が含まれています。

答えて

5

私が正しく理解している場合は、ハンドラ関数内のバインドされたコンテキストとバインドされていないコンテキストの両方への参照を保持する必要があります。これを実現するには、太い矢印のような手作業で手動で行うことができます。

class TheListenerObject 
    constructor: -> 
    context = @ # some people may call it `self` 
    @theHandlerMethod =() -> 
     referenceToTheListenerObjectInstance = context 
     referenceToTheUnboundContext = @ 
+0

これは一般的な解決策です...それはうまくいくでしょうが、内部には魔法があります。このコードが実行されるたびに、コンテキストは新しい匿名オブジェクトのハンドラメソッドでラップされます。 (jsの性質として)存在すれば私はよりクリーンな方法を探しています。私が言ったように、この問題を避けるためにハンドラの内部にコンテキストを作成しました。 –

+1

@ChenKinnrot次に、いくつかのコード例を提供することをお勧めします。あなたが欲しいものと既に達成したものを理解することは非常に難しいです。私が確実に言うことの1つは、関数が外部スコープからのオブジェクトを参照するようにするには、必然的にいくつかのフェーズでクロージャでラップし、新しいコンテキストごとに関数を再宣言する必要があるということです。ここには魔法はなく、ジャバスクリプトだけです。 –

+0

良い方法、おかげで罰金できませんでした。 –

関連する問題