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