1

アプリケーション内の内部メッセージ バスとしてEventEmitter2を使用しています。ここで、いくつかのイベント ハンドラーをバインドおよびバインド解除する必要があります。また、特定のコンテキストにバインドする必要があるため、最終的に次の構文になります。

messageBus.on('foo::bar', _.bind(eventHandler, this));

問題は、後でバインドを解除する必要があることです。そのため、次のように書きました。

messageBus.off('foo::bar', _.bind(eventHandler, this));

_.bind残念ながら、毎回ラッパー関数の新しいインスタンスが返されるため、これは機能しません。もちろん、一度実行_.bindして、次のようにラップされた関数をバインドすることもできます。

var fn = _.bind(eventHandler, this);
messageBus.on('foo::bar', fn);
messageBus.off('foo::bar', fn);

これは問題なく機能しますが、イベント ハンドラーがいくつかある場合、コードはすぐに必要以上に読みにくくなります。

bind関数への呼び出しを外部化する必要なしに、これをどのように解決できますか? 複数回呼び出し、関数とコンテキストが同じ場合に常に同じラッパーを返す代替関数はありますか?

4

1 に答える 1

2

Underscore.js は、ドキュメントbindAllから、このユースケース専用のメソッドを提供します:

メソッドが呼び出されるたびに、そのオブジェクトのコンテキストで実行されるように、methodNames で指定されたオブジェクトにいくつかのメソッドをバインドします。

それができない場合は、呼び出されたときに常に同じバインドされた関数を返すクロージャーを利用できます。つまり、次のようになります。

function getOrCreateBoundEventHandlerFor(eventType, callback) { 

    // Initialise the handler map if it's not already been created.
    this._boundEventHandlerMap = this._boundEventHandlerMap || {};

    // If no handler was mapped, create a new one.
    if (this._boundEventHandlerMap[eventType] === void 0) {
        this._boundEventHandlerMap[eventType] = _.bind(callback, this);
    }

    return this._boundEventHandlerMap[eventType];
}
于 2013-03-23T14:29:28.700 に答える