2016-03-24 52 views
1

这是我的控制器:明确的时间间隔不工作

.controller('mainController', function($http, $scope, $timeout, $sce, updateService) { 
     updateData = function() { 

      updateService.getDataA($http, $scope); 
      updateService.getDataB($http, $scope, $sce); 
     } 
     var updateIntervalId = setInterval(updateData, 1000); 
    }) 

现在,当用户刷新页面个旧请求仍然被提出,我试图把这个间隔号召下将其取消:

window.onbeforeunload = function() { 
    console.log('interval killed'); 
    clearInterval(updateIntervalId);  
} 

控制台正在记录'间隔死亡',所以它正在执行,但请求仍在进行,为什么?

+0

使用'var updateIntervalId',您可以将变量'updateIntervalId'绑定到回调函数'function($ http,$ scope,$ timeout,$ sce,updateService){',因此无法从您的'onbeforeunload '回调。 –

回答

1

让我们做角方式

进样$interval服务在您的控制器

和更新您的代码如下

var intervalPromise = $interval(updateData, 1000); 

$scope.$on('$destroy', function() { // Gets triggered when the scope is destroyed. 
    $interval.cancel(intervalPromise); 
}); 

,并删除window.onbeforeunload事件处理程序。

0

当谈到angularJS我总是建议使用$interval来处理间隔,因为它更适合angularJS隐藏的机制。

然后,如果事件window.onbeforeunload位于控制器之外,您将永远无法访问updateIntervalId,因为它位于另一个范围内,因此您应该使其成为全局范围。

+1

不管怎样,最好不要使用'window.onbeforeunload',因为'onbeforeunload'可以被任何其他代码改变,所以它不可靠。最好是使用'window.addEventListener(“beforeunload”,...)'并将它放在'var updateIntervalId = setInterval(updateData,1000)后面'' –

+0

你是完全正确的,我只是指出问题可能是不同的范围! – Luke