$.proxy() работает не так, как ожидалось. Я подозреваю, что он не работает на вложенном объекте

Сначала я узнал об этой функции, читая исходный код bootstrap.js. Если вы не знакомы, вот документ.

Через несколько проб и ошибок я обнаружил, что $.proxy() не работает для многоуровневого объекта. Это правда? Вот мой код:

ProgressBtn.prototype.reset = function(ms) {
 var self = this;
 //this.$progressInicator is a jquery object
 // here is the problem: reset() call is not working, nor displaying error
 var reset = $.proxy( this.$progressIndicator.css, 
 this, 
 {'background-color': 'red'}
 ); 
 reset();
 console.log('reset is running');

}

Я думаю, что эта строка кода имеет проблему:

var reset = $.proxy( this.$progressIndicator.css, 
 this, 
 {'background-color': 'red'}
 );

Можете ли вы помочь мне диагностировать проблему? Благодарю!

1 ответ

Проблема в том, что у вас есть это:

var reset = $.proxy( this.$progressIndicator.css, 
 this, 
 {'background-color': 'red'}
);

Это приведет к тому, что это произойдет:

this.$progressIndicator.css.call(this, {'background-color': 'red'});

Но this не объект jQuery, вызов css с этим контекстом не будет иметь никакого эффекта.

Ты нуждаешься в этом:

var reset = $.proxy( this.$progressIndicator.css, 
 this.$progressIndicator, 
 {'background-color': 'red'}
);

Однако я не понимаю, почему вы делаете это таким образом, если единственное, что вы хотите, чтобы ваш метод reset выполнял, - это изменить свойство CSS объекта. Вы можете добиться того же:

ProgressBtn.prototype.reset = function(ms) {
 this.$progressIndicator.css({'background-color': 'red'});
};

$.proxy полезен, если вы хотите присоединить обработчик к событию и хотите, чтобы этот обработчик выполнялся с определенным контекстом (например, делегатом.NET)

licensed under cc by-sa 3.0 with attribution.