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