2014-11-27 3 views
-1

моей функции обратного вызова не видит «это»функция обратного вызова не видит «это»

вот мой код связывания нажатия:

 initialize: function() { 
     $(document).bind('keyup', this.keyPress); 
     _.bindAll(this, 'rotate'); 
    }, 
    rotate: function (event) { 
     //smth... 
    } 

здесь функция Keypress:

 keyPress: function(event) { 
     console.log(event.keyCode); 
     var pageX = 0, pageY = 0; 
     var ev = new Object(); 
     ev.pageY = pageY; 
     ev.pageX = pageX; 

     func = this.rotate; 
     func(ev); 
     //also I tried like this: 
     //this.rotate(ev); 
    } 

это ошибка: «Uncaught TypeError: не определено не функция»

я не могу получить его.

Я по-настоящему признателен за вашу помощь, спасибо!

+0

В идеале вы должны показать больше кода, так что мы получаем лучшее представление о том, где вещи находятся в области видимости, и что 'this' намерен на самом деле be –

+0

Что такое 'this' ссылки, и где определен handler' keyPress'? –

ответ

1

Проблема здесь состоит в том, что в JQuery, привязать добавляет слушатель событий, он не устанавливает контекст «этого»

Вам необходимо связать метод с контекстом, с помощью подчеркивания.

например.

initialize: function() { 
    $(document).bind('keyup', _.bind(this.keyPress, this)); 
    _.bindAll(this, 'rotate'); 
}, 
rotate: function (event) { 
    //smth... 
} 

Это будет гарантировать, что «это» относится к правильному объекту

+0

Вы также можете привязать контекст к самой функции - keyPress: function (e) {...} .bind (this) – LouisK

+0

@LouisK: Но 'this' не будет экземпляром, когда определялся' keyPress', 'this', вероятно, будет« оконным »в то время. '$ (document) .bind ('keyup', this.keyPress.bind (this))' будет работать хотя или '_.bindAll (это, 'rotate', 'keyPress'); $ (document) .bind ('keyup', this.keyPress) '. –

+0

Это все еще оставляет привязку к «документу», если это представление удалено или создается другое. Должно быть 'remove' переопределить [' off'] (http://api.jquery.com/off/) эту привязку, и это будет лучше работать с подходом '_.bindAll' (или пространством имен событий). Конечно, что бы ни управляло представлениями, нужно было бы вызвать 'remove' перед заменой представления. –

Смежные вопросы