У меня есть мое угловое приложение, настроенное с директивой ng-view в index.html, с представлениями, настроенными с конфигурацией $ routeProvider, и каждый вид имеет свой собственный контроллер. В одном контроллере представления у меня есть $ rootScope. $ On listener, который следит за событиями. Я ожидаю, что этот слушатель больше не будет работать, когда я изменю представления, но это не так. Часы все еще продолжают вызывать код, когда он запускается, даже когда я переключился на представление, которое больше не использует этот контроллер.
Я установил некоторый тестовый код для прослушивания события $ destroy, и я вижу, что событие $ destroy запускается, но функция прослушивателя все еще работает. Я распечатал $ scope. $ Id как в функции часов, так и в прослушивателе событий $ destroy, и я вижу, что идентификаторы совпадают. Таким образом, кажется, что даже после того, как событие $ 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. $ на слушателе. Я буду обновлять с помощью plnkr и редактировать. – TheSharpieOne
Извините, на самом деле это так, что вы можете продемонстрировать свою логику/проблему через [plunk] (http://plnkr.co) или [скрипка] (http://jsfiddle.net) – dz210
Возможный дубликат [Как я могу отменить регистрацию вещательного события на корневой каталог в AngularJS?] (Http://stackoverflow.com/questions/18856341/how-can-i-unregister-a-broadcast-event-to-rootscope-in -angularjs) – WebWanderer