2014-10-19 15 views
81

$interval'u kullanarak düzenli aralıklarla veriyi sunucudan aldığım bir demo hazırlıyorum Şimdi bunu durdurmam/iptal etmem gerekiyor.Açısallarda timeInterval nasıl temizlenir veya durdurulur?

Bunu nasıl başarabilirim? İşlemi yeniden başlatmam gerekirse, bunu nasıl yapmalıyım?

İkincisi, bir sorum daha var: Zaman aralıklarının ardından sunucudan veri alıyorum. $scope.apply veya $scope.watch'u kullanmaya gerek var mı?

app.controller('departureContrl',function($scope,test, $interval){ 
    setData(); 

    $interval(setData, 1000*30); 

    function setData(){ 
     $scope.loading=true; 
    test.stationDashBoard(function(data){ 
     console.log(data); 
     $scope.data=data.data; 
     $scope.loading=false; 
     //alert(data); 
    },function(error){ 
     alert('error') 
    }) ; 

    } 
}); 

http://plnkr.co/edit/ly43m5?p=preview

cevap

129

Sen aralık tarafından döndürülen söz depolamak ve bu sözü aralığını iptal bu sözü, hiç $interval.cancel() kullanabilirsiniz:

İşte benim plunker olduğunu. Aralığın başlatılması ve durdurulması için, durdurmak istediğinizde ve belirli bir etkinlikten tekrar başlatmak istediğinizde start() ve stop() işlevlerini oluşturabilirsiniz. Aşağıda, olayların kullanımı yoluyla (ör. ng-click) ve denetleyicide uygulanarak bir aralığın başlatılması ve durdurulmasıyla ilgili temel bilgileri gösteren bir pasaj oluşturdum.

angular.module('app', []) 
 

 
    .controller('ItemController', function($scope, $interval) { 
 
    
 
    // store the interval promise in this variable 
 
    var promise; 
 
    
 
    // simulated items array 
 
    $scope.items = []; 
 
    
 
    // starts the interval 
 
    $scope.start = function() { 
 
     // stops any running interval to avoid two intervals running at the same time 
 
     $scope.stop(); 
 
     
 
     // store the interval promise 
 
     promise = $interval(setRandomizedCollection, 1000); 
 
    }; 
 
    
 
    // stops the interval 
 
    $scope.stop = function() { 
 
     $interval.cancel(promise); 
 
    }; 
 
    
 
    // starting the interval by default 
 
    $scope.start(); 
 
    
 
    // stops the interval when the scope is destroyed, 
 
    // this usually happens when a route is changed and 
 
    // the ItemsController $scope gets destroyed. The 
 
    // destruction of the ItemsController scope does not 
 
    // guarantee the stopping of any intervals, you must 
 
    // be responsible for stopping it when the scope is 
 
    // is destroyed. 
 
    $scope.$on('$destroy', function() { 
 
     $scope.stop(); 
 
    }); 
 
      
 
    function setRandomizedCollection() { 
 
     // items to randomize 1 - 11 
 
     var randomItems = parseInt(Math.random() * 10 + 1); 
 
     
 
     // empties the items array 
 
     $scope.items.length = 0; 
 
     
 
     // loop through random N times 
 
     while(randomItems--) { 
 
     
 
     // push random number from 1 - 10000 to $scope.items 
 
     $scope.items.push(parseInt(Math.random() * 10000 + 1)); 
 
     } 
 
    } 
 
    
 
    });
<div ng-app="app" ng-controller="ItemController"> 
 
    
 
    <!-- Event trigger to start the interval --> 
 
    <button type="button" ng-click="start()">Start Interval</button> 
 
    
 
    <!-- Event trigger to stop the interval --> 
 
    <button type="button" ng-click="stop()">Stop Interval</button> 
 
    
 
    <!-- display all the random items --> 
 
    <ul> 
 
    <li ng-repeat="item in items track by $index" ng-bind="item"></li> 
 
    </ul> 
 
    <!-- end of display --> 
 
</div> 
 

 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

+0

@thanks uygulamak eklemek veya i zaman – user944513

+0

Hayır hizmet reqular aralıklarla veri alınırken am ne zaman izlemek için herhangi bir ihtiyaç var ..is '$ interval' hizmetini kullanıyorsanız, 'apply()' işlevini kullanmanıza gerek yoktur, çünkü bunu sizin için yapar. Ancak yerleşik 'setInterval()' kullanıyorsanız, '$ scope. $ Apply()' kullanmanız gerekebilir. – ryeballar

+0

Çok iyi bir çözüm. "$ Destroy", "http-auth-interceptor" ile birlikte iyi çalışır, benim durumumda olduğu gibi, hatayı auth hatası sırasında (süresi dolmuş oturumda) durdurmak ve başarılı bir şekilde auth sonra tekrar başlatmak istiyorum. Bu mükemmel çözüm için teşekkür ederiz. – Neel

31
cevap için
var interval = $interval(function() { 
    console.log('say hello'); 
}, 1000); 

$interval.cancel(interval); 
+0

basit ve anlaşılır bir çözüm, mükemmel çalışıyor –

8
var promise = $interval(function(){ 
    if($location.path() == '/landing'){ 
     $rootScope.$emit('testData',"test"); 
     $interval.cancel(promise); 
    } 
},2000); 
+0

URL'ler gelecekte değişebileceğinden, “$ location.path()” ifadesini kullanmadan önce iki kez düşünürdüm. –

1
$scope.toggleRightDelayed = function(){ 
     var myInterval = $interval(function(){ 
      $scope.toggleRight(); 
     },1000,1) 
     .then(function(){ 
      $interval.cancel(myInterval); 
     }); 
    };