2016-03-25 2 views
1

Привет, я строил функциональность в Angular, но у меня есть некоторые проблемы. У меня есть ng-model и пример-директива, вот так.

<input ng-model="model" type="text" class="form-control"> 
 
<div example-dir test="model"></div>

Я хочу передать нашу модель от входа до директивы и каждый новый вал от этой модели запустить $ таймаут, но первый новый вал должен начать $ таймаут, но каждый следующий новый val должен перезапустить наш $ timeout.

Например. Когда мы передаем данные для ввода начального старта $ timeout (1000 мс для eaxmple), но каждый следующий данные должны перезапустить наш $ timeout до 0 и начать старт снова.

Существует моя директива код:

function link(scope, element, attr) { 
 
     
 
     scope.$watch('test',function(nval){ 
 
     var timeout; 
 
     function incrementTimer(){ 
 
      //some stuff 
 
     } 
 
      if(nval){ 
 

 

 
       timeout = $timeout(incrementTimer, 1000); 
 
       $timeout.cancel(timeout); 
 

 
      } 
 
     }); 
 
        
 
      
 
    }

Я не имею понятия, где и когда проходят $ таймаута и отменить работать corectly. Спасибо за помощь.

ответ

2

Что вы делаете, это переопределение переменной timeout с каждой итерацией. Объявить перерыв в функции связи, а затем просто сбросить его:

link: function (scope) { 
    function myFunc() { console.log('tick'); }  
    var timeout; 

    scope.$watch(function() { 
     return scope.test; 
    }, function (newVal, oldVal) { 
     if (timeout) { 
      $timeout.cancel(timeout); 
     } 
     timeout = $timeout(myFunc, 1000); 
    }); 
} 

Fiddle

+1

Спасибо за удивительный простой ответ! –

+0

Можете ли вы рассказать мне, как я могу проверить, есть ли область. $ Watch value is empty? –

+0

@JanKowalski У вас есть 'newVal' и' oldVal'. Если вы хотите, чтобы обновленная проверка значения для 'if (! NewVal) {// значение пуста}' –

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