@sanex3339

Как в typescript удалить event handler?

Проблема:

window.addEventListener(eventType, event => this._handler(event));
window.removeEventListener(eventType, event => this._handler(event));

private _handler (event) {
    this._blablabla(event.pageX, event.pageY);
}


Таким способом эвент аттачится к window, но не удаляется.

Если делать таким способом
window.addEventListener(eventType, this._handler);
window.removeEventListener(eventType, this._handler);


Работает,разумеется, но внутри хендлера не будут доступны свойства и методы класса через this.

Через
window.addEventListener(eventType, this._handler.bind(this));
window.removeEventListener(eventType, this._handler.bind(this));


тоже не работает.

Как правильно удалить event handler в таком случае?
  • Вопрос задан
  • 776 просмотров
Решения вопроса 1
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Через this._handler.bind(this) не работает потому что Function#bind возвращает новую функцию (причем каждый раз разную, т.е.
this._handler.bind(this) !== this._handler.bind(this)
).
Соответственно, надо как-то так:
this.boundHandler = this.handler.bind(this);
window.addEventListener(eventType, this.boundHandler);
//...
window.removeEventListener(eventType, this.boundHandler);


Ну естественно можно написать какую-то обертку. Например:
function bound (eventType: string, handler: Function, context: any): Function {
    var boundHandler = handler.bind(context);
    window.addEventListener(eventType, boundHandler);
    return () => window.removeEventListener(eventType, boundHandler);
}

Такая функция вернет функцию, которая при вызове отвяжет ранее привязанный обработчик.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
02 нояб. 2024, в 23:04
80000 руб./за проект
02 нояб. 2024, в 21:08
2000000 руб./за проект