【发布时间】:2016-12-28 16:23:04
【问题描述】:
我在 index.html 中使用 ng-view 指令设置了我的 Angular 应用程序,视图配置了 $routeProvider 配置,每个视图都有自己的控制器。在一个视图控制器中,我有一个 $rootScope.$on 监听器来监视事件。我希望这个监听器在我更改视图时不再运行,但事实并非如此。手表在触发时仍会继续调用代码,即使我切换到不再使用该控制器的视图也是如此。
我已经设置了一些测试代码来监听 $destroy 事件,我可以看到 $destroy 事件正在被触发,但是监听函数仍然运行。我在 watch 函数和 $destroy 事件监听器中都打印了 $scope.$id,我可以看到 ID 匹配。因此,似乎即使在特定范围内发生 $destroy 事件后,其上的 $on 侦听器仍会继续运行。为什么会这样?我的印象是,当导航到不同的视图时,或者在任何情况下控制器被销毁时,它的侦听器都会被清除。
Plnkr:http://plnkr.co/edit/TxssxQJY5PVLTAIAr4xD?p=preview
var animateApp = angular.module('animateApp', ['ngRoute', 'ngAnimate']);
animateApp.config(function($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'page-home.html',
controller: 'mainController'
})
.when('/about', {
templateUrl: 'page-about.html',
controller: 'aboutController'
})
.when('/contact', {
templateUrl: 'page-contact.html',
controller: 'contactController'
});
});
angular.module('animateApp').service('service', ['$interval', '$rootScope', service]);
function service ($interval, $rootScope) {
var service = {};
service.abc = 1;
$interval(function() {
service.abc++;
$rootScope.$broadcast('service.abc', service.abc);
}, 500);
return service;
}
animateApp.controller('mainController', function($scope, $rootScope, service) {
$scope.pageClass = 'page-home';
$scope.$on('$destroy', function iVeBeenDismissed() {
console.log('goodbye ' + $scope.$id);
// release resources, cancel request...
})
$rootScope.$on('service.abc', function (newval) {
console.log($scope.$id);
})
});
animateApp.controller('aboutController', function($scope) {
$scope.pageClass = 'page-about';
});
animateApp.controller('contactController', function($scope) {
$scope.pageClass = 'page-contact';
});
【问题讨论】:
-
对不起,实际上它是一个 $rootScope.$on 监听器。我将使用 plnkr 进行更新并进行编辑。
标签: javascript angularjs lifecycle watch ng-view