AngularJS:如何防止在控制器刷新上创建多个事件侦听器



我有控制器这样:

myApp.controller('loginCtrl', ['$scope', '$rootScope', '$http', '$location', function($scope, $rootScope, $http, $location){
    console.log('check 1');
    // before route update
    //---------------------------------------------------------
    $rootScope.$on('$locationChangeStart', function(event){
        if($location.path() == "/login"){
            console.log('check 2');
        }
    });
}]);

首次记录check 1,当我单击/login链接时,check 2将被记录。每当我更改通往/家的路径和/登录路径时,我都希望在控制台上有新的check 2,但是我在控制台中看到的就是这样:

check 2 (1 time)
check 2 (2 times)
check 2 (3 times)
check 2 (4 times)
...

这意味着每个位置的变化,Angularjs创建了一个新的侦听器,并且check 2的数量增加了!是否有标准在没有此问题的情况下侦听位置更改的方式?或者我应该在离开/login页面之前删除听众?


其他文件

我的app.js文件:

...
when('/login', {
  templateUrl: 'page/login.html', 
  controller: 'loginCtrl', 
  reloadOnSearch: false
})
...

登录模板:

<section class="login-page section">
    <h3>Login</h3>
    ...
</section>

这是因为您在控制器中使用$rootScope.$on订阅。当您以这种方式订阅时,Angularjs没有机会在您的本地$scope被销毁时为您清理听众。

只需订阅$scope.$on('$locationChangeStart', fn);,如果您以这种方式订阅,AngularJS将在您的本地$scope被销毁时自动删除侦听器。

最新更新