angularjs에서 timeInterval을 지우거나 중지하는 방법은 무엇입니까?


91

나는 $intervalNow I need to stop / cancel this를 사용하여 일정한 시간 간격 후에 서버에서 데이터를 가져 오는 데모를 만들고 있습니다.

이것을 어떻게 할 수 있습니까? 프로세스를 다시 시작해야하는 경우 어떻게해야합니까?

둘째, 한 가지 더 질문이 있습니다. 일정한 시간 간격 후에 서버에서 데이터를 가져오고 있습니다. $scope.apply또는 사용할 필요가 $scope.watch있습니까?

내 플 런커는 다음과 같습니다.

  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

답변:


158

간격에 의해 반환 된 약속을 저장하고 해당 약속에 사용할 수 있습니다. 그러면 $interval.cancel()해당 약속의 간격이 취소됩니다. 간격의 시작 및 중지를 위임하기 위해 특정 이벤트에서 중지하고 다시 시작할 때마다 start()stop()기능을 만들 수 있습니다 . 이벤트 (예 :) ng-click및 컨트롤러 에서보기로 구현하여 간격 시작 및 중지의 기본 사항을 보여주는 스 니펫을 아래에 만들었습니다 .

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>


@ 답장을 주셔서 감사합니다 .. 내가 서비스 요청 간격에서 데이터를 가져올 때 적용 또는 시청을 추가 할 필요가
있습니까

아니요 apply(), $interval서비스를 사용하는 경우을 사용할 필요가 없습니다 . 그러나 내장 기능 setInterval()을 사용하는 경우 $scope.$apply().
ryeballar 2014 년

아주 좋은 솔루션입니다. 이 $destroy아니라 함께와 작동 http-auth-interceptor내가 (만료 세션 등) 인증 실패시의 간격을 중지하고 succesfull 인증 후 다시 시작하려는 내 경우처럼. 이 우수한 솔루션에 감사드립니다.
Neel 2015

37
var interval = $interval(function() {
  console.log('say hello');
}, 1000);

$interval.cancel(interval);

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

URL은 향후 변경 될 수 있기 때문에 내가 사용하기 전에 두 번 생각 $location.path()하지 상태 이름을
또는 두안

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

1

변수에 대한 간격 저장 약속을 생성하려는 경우 :

var p = $interval(function() { ... },1000);

간격을 중지 / 삭제하려면 다음을 사용하십시오.

$interval.cancel(p);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.