javascript - 如何清除或停止angularjs中的timeInterval?

标签 javascript angularjs angularjs-scope

我正在做一个演示,我在使用 $interval 定期从服务器获取数据现在我需要停止/取消它。

我怎样才能做到这一点?如果我需要重新启动进程,我应该怎么做?

其次,我还有一个问题:我每隔一段时间就会从服务器获取数据。是否需要使用$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

最佳答案

您可以存储间隔返回的 promise ,并对该 promise 使用 $interval.cancel(),这会取消该 promise 的间隔。要委托(delegate)间隔的开始和停止,您可以创建 start()stop() 函数,只要您希望从特定事件停止并再次启动它们。我在下面创建了一个片段,展示了开始和停止间隔的基础知识,方法是通过使用事件(例如 ng-click)在 View 中和在 Controller 中实现它。

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>

关于javascript - 如何清除或停止angularjs中的timeInterval?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26447923/

相关文章:

javascript - 如果没有所有 "if"和 "else"语句,是否有更有效的方法来执行此操作?

javascript - 窗口大小调整时多行文本 chop

javascript - FormArray 中的嵌套 FormGroup 重复所有单选按钮值 - Angular(带有 PrimeNG 的 UI)

Javascript数组长度修改的影响

angularjs - 使用 angularjs 和 ui-router,如何禁用一个 View 更改的导航器历史记录

javascript - 如何清除 angularJS 数组

javascript - Angular 图表无法让标签按我需要的方式工作

javascript - Angularjs 清除 ng-repeat 过滤器

javascript - 当数据存在时,Angularjs范围数组不显示

javascript - 如何在单个 AngularJS 上下文中设置多个选择元素的选定值