Я создал класс под названием SearchBox для обработки взаимодействия с поиском (отложенный триггер, поиск по нажатию клавиши ввода, предотвращение поиска, когда он активен, синхронизация результатов при завершении поиска и изменении текста и т. Д.).Правильный способ привязки «this» в обратных вызовах JavaScript-событий?
Все методы класса - это прототипы, предназначенные для доступа через this
. В следующем коде предположим, что p
является прототипом класса.
p.registerListeners = function() {
$(this.element).on('keypress', this.searchKeyPressed);
};
p.unregisterListeners = function() {
$(this.element).off('keypress', this.searchKeyPressed);
};
Это не работает, потому что, когда событие нажатие вызывает searchKeyPressed
обработчик, он не делает это в контексте this
. Единственное решение, которое я могу придумать, - это тот, который поддерживает только современные браузеры, который связывает обратный вызов с this
, который фактически создает новую функцию. Поскольку он создает новую функцию, я должен кэшировать ее, чтобы удалить ее позже, так как я должен передать ту же ссылку на off
, что я перешел на on
.
Есть ли лучший способ сделать это, чем это, или это нормально?
var boundKeyPressed;
p.registerListeners = function() {
boundKeyPressed = this.searchKeyPressed.bind(this);
$(this.element).on('keypress', boundKeyPressed);
};
p.unregisterListeners = function() {
$(this.element).off('keypress', boundKeyPressed);
};
Я подумал, что, может быть, jQuery.on
бы обеспечить способ сделать это событие связывания автоматически, но вместо этого он кажется, что он связывает this
разные вещи в зависимости от того, как это называется. Например, при использовании on('eventname',instance.func)
является «currentTarget» (не обязательно «целевой» в условиях барботирования), тогда как при использовании on('eventname','selector',instance.func)
this
относится к элементу, соответствующему селектору. В любом случае, func
работает так, как будто он не имеет отношения к instance
.
Отсутствует методы AS3, где это не было проблемой. Ничто не похоже на переход на 10 лет назад с JS, работающий с избыточным синтаксисом типа «this.method.bind (this)» (с ограниченной поддержкой, заметьте), где «this.method» должно быть достаточно. – Triynko
Вы пробовали передать это обработчикам в качестве параметра – Binvention
Так как boundkeypress запускает другую функцию, поэтому этот параметр не подключен, если вы не передадите его ему – Binvention