1

我在使用EventEmitter2作爲我的應用程序內部的消息總線。現在我需要綁定和解綁一些事件處理程序。正如我希望他們也bind他們給定的情況下,我最終的語法如下:綁定綁定函數並將其解除綁定到事件

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功能的呼叫外部化?是否有一個替代函數總是返回相同的包裝,以防多次調用並且函數和上下文相同?

回答

2

Underscore.js提供bindAll方法只是用於該用途的情況下,從documentation

綁定一個數的對象的方法,通過指定的方法名,在該對象的上下文中運行每當他們被調用

如果做不到這一點,你可以使用一個封閉調用時總是返回相同的綁定功能,即:

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]; 
}