Я использую jQuery и lodash для создания интерфейса, и я использую делегированные события следующим образом:
function Interface() {
this.connectEvents();
_.bindAll(this);
};
_.extend(Interface.prototype, {
connectEvents : function() {
this.$clockNav.on('click', '.navprev a', this.previousTime);
},
previousTime : function() {
this.getPreviousTime(this.currentTime);
}
});
Однако, хотя я использовал _.bindAll
чтобы связать previousTime
время с экземпляром объекта Interface, который я контролирую, jQuery перезаписывает эту привязку и вместо этого устанавливает this
элемент, на который я нажал. Как я могу остановить jQuery от этого и сохранить правильное значение this
?
Вы можете использовать $.proxy() для передачи настраиваемого контекста для обратного вызова обработчика события
Interface.prototype.connectEvents = function() {
this.$clockNav.on('click', '.navprev a', $.proxy(this.previousTime, this));
};
Используйте собственный метод jQuery.proxy или Function.prototype.bind.
Interface.prototype.connectEvents = function() {
this.$clockNav.on('click', '.navprev a', $.proxy(this.previousTime, this));
};
ИЛИ
Interface.prototype.connectEvents = function() {
this.$clockNav.on('click', '.navprev a', this.previousTime.bind(this));
};
Существует множество способов сделать это. Другой метод, который еще не упоминался, заключается в использовании локальной локализации в замыкании:
_.extend(Interface.prototype, {
connectEvents : function() {
var self = this;
this.$clockNav.on('click', '.navprev a', function() {self.previousTime()});
},
previousTime : function() {
var self = this;
this.getPreviousTime(function() {self.currentTime()});
}
});
Проблема оказалась намного проще, чем я думал: в моей функции инициализации я вызывал connectEvents
перед _.bindAll
. D'о.