1

EventEmitter2을 내 응용 프로그램 내에서 메시지 버스 내부로 사용하고 있습니다. 이제 일부 이벤트 처리기를 바인딩하고 바인딩 해제해야합니다.바인드 된 함수를 이벤트에 바인딩하고 바인딩 해제

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

문제는 내가 시간에 나중에 그들을 바인딩을 해제 할 필요가있다, 그래서 나는 썼다 : 나는 주어진 상황에 bind에 또한 그들이 원하는대로, 나는 다음과 같은 구문을 끝낼

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는 documentation에서, 단지 본 유스 케이스위한 bindAll 방법을 제공한다 :

메소드 이름에 의해 지정된 개체에 다수의 방법, 해당 개체의 컨텍스트에서 실행되는 바인딩

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]; 
} 
,536 : 그들은 그 실패

를 호출 할 때마다, 당신은 호출 할 때 항상 같은 바인딩 기능을 반환하는 폐쇄, 즉의 사용을 만들 수
관련 문제