我有一个Angular JS应用程序,我想在路由成功更改时每秒进行一次全局操作。所以我创建了一个.run()块,其中我是DI $ interval并在$ routeChangeSuccess上使用$ interval。奇怪的是,每次改变路线后,间隔开始越来越快。 这是我的代码:
app.run(["$interval", "$rootScope", function($interval, $rootScope){
$rootScope.$on("$routeChangeSuccess", function(event, current){
if(current.$$route.authenticate){
$interval(function(){
console.log("whatever");
}, 1000);
}
});
}]);
总而言之,“无论什么”控制台日志开始越来越快。是因为 $ interval 是一个Singleton所以每次都会重新创建吗?但为什么不删除旧的 $ interval ?
答案 0 :(得分:0)
我不明白为什么要在每个routesChange上附加一个每秒运行一次的新间隔。如果我理解正确,你希望它在路线需要authenticate
时每秒检查一次吗?如果是,则如果路线不再是interval
,则需要取消authenticate
。
如果您不想再将其取消,则需要删除$interval
。
var stopTime = $interval(DoJob, 1000);
// delete when you dont need it anymore.
$interval.cancel(stopTime);
请参阅$interval
了解app.run(["$interval", "$rootScope", function($interval, $rootScope){
var intervalPtr = null;
$rootScope.$on("$routeChangeSuccess", function(event, current){
//page needs authentication
//and interval was not set yet.
if(current.$$route.authenticate && intervalPtr === null){
intervalPtr = $interval(function(){
console.log("whatever");
}, 1000);
// page that does not need authentication
// reset only of there is a interval running
} else if (intervalPtr !== null) {
$interval.cancel(intervalPtr);
intervalPtr = null;
}
});
}]);
{{1}}
答案 1 :(得分:0)
在$interval
doc:
此服务创建的间隔时间必须明确销毁 你完成了它们。特别是它们不是自动的 当控制器的范围或指令元素被破坏时被破坏 销毁。你应该考虑到这一点,并确保 总是在适当的时候取消间隔。
所以在创建新的$ interval之前不要忘记取消之前的$ interval:
app.run(["$interval", "$rootScope", function($interval, $rootScope){
var interval = null;
$rootScope.$on("$routeChangeSuccess", function(event, current){
$interval.cancel(interval);
if(current.$$route.authenticate){
interval = $interval(function(){
console.log("whatever");
}, 1000);
}
});
}]);