Я ищу способ для правильного вызова this
Внутренняя функция теперь у меня есть быстрый хак var that = $(this);
, но я уверен, что есть способ использования. Как я могу избежать этого взлома?Вызов этого внутри setTimeout
Это поле ввода, которое я использую, чтобы получить вар и проверить Typing Интервал
<input type="text" data-package="pink" class="js-p-input">
это я мой код:
var cCalc = (function ($) {
var s;
return {
settings: {
typingTimer: "",
doneTypingInterval: 300,
$inputs: $(".js-p-input"),
},
init: function() {
s = this.settings;
this.bindUIActions();
},
bindUIActions: function() {
//on keyup, start the countdown
s.$inputs.on('keyup', function() {
var that = $(this);
clearTimeout(s.typingTimer);
s.typingTimer = setTimeout(function() {
cCalc.doneTyping(that, that.data("package"));
}, s.doneTypingInterval);
});
s.$inputs.on('keydown', function() {
clearTimeout(s.typingTimer);
});
},
doneTyping: function ($input, packageName) {
console.log('done!');
cCalc.getValues($input.val(), packageName);
},
};
})(jQuery);
cCalc.init();
он не работает с $ (это), потому что вы находитесь в setTimeout, поэтому это изменилось. – progrAmmar
Я думаю, что это правильный способ передать эту переменную другой функции. Аналогичный вопрос: http://stackoverflow.com/questions/11366643/how-do-i-change-scope-of-this-in-setinterval-and-settimeout-functions – Atticweb
'setTimeout (function() {...} .bind (this), s.doneTypingInterval); "EDIT: но ничего не получается с использованием закрытия, как в коде. Другим способом может быть: setTimeout (cCalc.doneTyping, s.doneTypingInterval, $ (this), $ (this) .data ("package")); 'даже передача' $ (this) .data ("package") ' кажется излишним, потому что внутри метода 'doneTyping()' вы можете получить данные, не передавая их как параметр: '$ input.data ('package')' –