将绑定函数绑定和解除绑定到事件

时间:2013-03-23 13:53:25

标签: javascript javascript-events event-handling bind underscore.js

我在我的应用程序中使用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函数,您如何解决这个问题?是否有一个替代函数总是返回相同的包装器,以防你多次调用它并且函数和上下文是相同的?

1 个答案:

答案 0 :(得分:2)

Underscore.js仅针对此用例提供bindAll方法,来自documentation

  

在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];
}
相关问题