始终取消注册在当前范围以外的其他范围上注册的侦听器
你必须始终取消注册当前范围之外的范围,如下所示:
//always deregister these
$rootScope.$on(...);
$scope.$parent.$on(...);
你不必在当前范围内取消注册列表,因为 angular 会处理它:
//no need to deregister this
$scope.$on(...);
如果导航到另一个控制器,$rootScope.$on
侦听器将保留在内存中。如果控制器超出范围,这将产生内存泄漏。
别
angular.module('app').controller('badExampleController', badExample);
badExample.$inject = ['$scope', '$rootScope'];
function badExample($scope, $rootScope) {
$rootScope.$on('post:created', function postCreated(event, data) {});
}
做
angular.module('app').controller('goodExampleController', goodExample);
goodExample.$inject = ['$scope', '$rootScope'];
function goodExample($scope, $rootScope) {
var deregister = $rootScope.$on('post:created', function postCreated(event, data) {});
$scope.$on('$destroy', function destroyScope() {
deregister();
});
}