我每2秒轮询我的数据,以保持他们在页面上更新。我的问题是当我访问另一个页面超时保持活动。当我访问新页面时,如何取消我的超时?
function IndexCtrl($scope,$timeout,RestData) { $scope.rd = {}; (function getRestDataFromServer() { RestData.query(function(data){ $scope.rd = data; $timeout(getRestDataFromServer,2000); }); })(); }
//编辑
我找到了一个解决方案,但我不知道如果它是一个好的。当我保存我的超时到$ rootScope,我可以取消它在所有其他控制器。
function IndexCtrl($scope,$rootScope,RestData) { $scope.rd = {}; (function getRestDataFromServer() { RestData.query(function(data){ $scope.rd = data; $rootScope.prom = $timeout(getRestDataFromServer,2000); }); })(); } function newPageCtrl($scope,$timeout) { $timeout.cancel($rootScope.prom); }
当路由被改变时,有两个角度事件被广播。你可以在IndexCtrl中使用$ scope。$ on监听它们,并相应地执行:
$ destroy事件
var promise = $timeout(getRestDataFromServer,2000); ... $scope.$on('$destroy',function(){ $timeout.cancel(promise); });
$ locationChangeStart
var promise = $timeout(getRestDataFromServer,2000); ... $scope.$on('$locationChangeStart',function(){ $timeout.cancel(promise); });
$ timeout()返回一个promise对象。该对象可以提供给$ timeout.cancel()函数来取消超时。