2016-06-15 2 views
0

Я ищу способ для правильного вызова 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(); 
+0

он не работает с $ (это), потому что вы находитесь в setTimeout, поэтому это изменилось. – progrAmmar

+0

Я думаю, что это правильный способ передать эту переменную другой функции. Аналогичный вопрос: http://stackoverflow.com/questions/11366643/how-do-i-change-scope-of-this-in-setinterval-and-settimeout-functions – Atticweb

+0

'setTimeout (function() {...} .bind (this), s.doneTypingInterval); "EDIT: но ничего не получается с использованием закрытия, как в коде. Другим способом может быть: setTimeout (cCalc.doneTyping, s.doneTypingInterval, $ (this), $ (this) .data ("package")); 'даже передача' $ (this) .data ("package") ' кажется излишним, потому что внутри метода 'doneTyping()' вы можете получить данные, не передавая их как параметр: '$ input.data ('package')' –

ответ

0

Там нет ничего плохого в использовании, что «взломать», он стандартная рабочая процедура. См. Также здесь What is the difference between call and apply? для еще более «хакерского» материала с «этим», который является стандартным.

0

Как уже отмечалось, есть на самом деле не что-то неправильно с помощью закрытия, но вы можете альтернативно связать «это» в области видимости функции тайм-аут, как так:

s.$inputs.on('keyup', function() { 

    clearTimeout(s.typingTimer); 

    s.typingTimer = setTimeout(function() { 

    cCalc.doneTyping($(this), $(this).data("package")); 

    }.bind(this), s.doneTypingInterval); 

}); 
Смежные вопросы