Сохранение контекста при использовании jQuery.on

0

Я использую 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?

Теги:
lodash

4 ответа

1

Вы можете использовать $.proxy() для передачи настраиваемого контекста для обратного вызова обработчика события

Interface.prototype.connectEvents = function() {
  this.$clockNav.on('click', '.navprev a', $.proxy(this.previousTime, this));
};
1

Используйте собственный метод 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));
};
0

Существует множество способов сделать это. Другой метод, который еще не упоминался, заключается в использовании локальной локализации в замыкании:

_.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()});
  }
});
0

Проблема оказалась намного проще, чем я думал: в моей функции инициализации я вызывал connectEvents перед _.bindAll. D'о.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню