角度アプリは、index.htmlにng-viewディレクティブで設定し、$ routeProvider設定と各ビューに独自のコントローラを設定します。あるView Controllerでは、イベントを監視する$ rootScope。$がリスナーにあります。ビューを変更したときにこのリスナーが動作しなくなると思っていますが、そうではありません。たとえそのコントローラをもはや使用していないビューに切り替えた場合でも、時計はトリガされたときにコードを呼び出し続けます。
$ destroyイベントを聴くためのテストコードをいくつか設定しましたが、$ destroyイベントがトリガーされていますが、リスナー関数は引き続き実行されています。ウォッチ関数と$ 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';
});
[plunk](http://plnkr.co)または[fiddle](http://jsfiddle.net) – Minato
[mcve] – TheSharpieOne
を入力してください申し訳ありませんが、実際は$ rootScope。$をリスナーで使用します。私はplnkrで更新して編集します。 – dz210