2016-03-24 84 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