2012-04-11 3 views

ответ

2

причина, почему он не работает в том, что, делая method(this) вы на самом деле вызвать его немедленно. method.bind(checkbox) украсит функцию и изменит область действия флажка, когда он будет вызван позже.

Почему бы не прокси-серверу?

var self = this; 
checkbox.addEvent('change', function(e) { 
    self.checkBoxChangeAgain(this); 
}); 

new Class({ 
    checkBoxChangeAgain: function(checkbox) { 
     this; // instance 
     checkbox; // == org checkbox 
    } 
}); 

По умолчанию первым аргументом обработчика события будет событие, а область действия будет триггерным элементом.

отсюда:

checkbox.addEvent('change', this.checkBoxChangeAgain); 

будет означать, что:

new Class({ 
    checkBoxChangeAgain: function(event) { 
     this === event.target; 
    } 
}); 

означает, что вы также можете:

checkbox.addEvent('change', this.checkBoxChangeAgain.bind(this)); 

и что будет работать как:

new Class({ 
    checkBoxChangeAgain: function(event) { 
     this != event.target; // true 
     event.target === checkbox; // true 
     this; // the class instance 
    } 
}); 

Надеюсь, это даст вам идеи. Кроме того, поиск bindWithEvent здесь на SO - в частности, замена bind с событием.

+0

Спасибо, я в конце концов получил вокруг него, используя проход. Вы ответили мне в правильном направлении. – Ashley

0

Подобно тому, как работает ответ Димитр, но используя Class.Binds, самый простой способ заключается в использовании .pass()http://mootools.net/docs/core/Types/Function#Function:pass

this.checkBoxChangeAgain.pass(checkbox)

+0

Опора на class.binds обычно не одобряется, поскольку она не способствует хорошей читаемости, особенно в длинном классе, а также производительности - самый дешевый способ исправить - это передать ссылку на это в переменной. все методы уже завернуты один раз ... –

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