Angularjs $ rootScope广播

时间:2015-03-30 18:31:11

标签: angularjs

所以我有这部分应用程序结构,我要实现的行为是:我想在用户尝试未经授权访问路由时启动一个事件,然后在{{1}上侦听该事件}}

LoginCtrl

现在的问题是,事件是在//First controller in application <body data-ng-controller="GatewayCtrl"> <div id="wrapper" data-ui-view="main"></div> </body> //then I have route which has `LoginCtrl` controller $stateProvider .state('login', { url: '/login', views: { 'main': { templateUrl: 'login.html', controller: 'LoginCtrl' } } }); app.run(['$rootScope', function ($rootScope) { $rootScope.$on('$stateChangeStart', function (event, next) { $rootScope.$broadcast('test-event'); }); }]); mdm.controller('LoginCtrl', ['$scope', function ($scope) { $scope.$on('test-event', function () { console.log('event'); }); }]); mdm.controller('CounterCtrl', ['$scope', function ($scope) { $scope.$on('test-event', function () { console.log('event'); }); }]); 控制器上触发而不是GatewayCtrl

导致此问题的原因是什么?我可以将其恢复原状吗?

1 个答案:

答案 0 :(得分:0)

嗯,这里发生的事情是角度控制器必须绑在元素或页面上(通过ng-controller属性或预定义的路由 - 在你的情况下&#34; / login&#34;)。

因此,根据您的示例,LoginCtrl尚未实例化,因此它无法将侦听器添加到该事件,甚至一旦它被销毁[控制器],侦听器将也走了。所以我认为这不是最好的策略。

你有几个选择: A)拥有这个&#34;听众&#34;在根控制器上,它将始终在整个应用程序中实例化,例如 AppController ,和/或 B)使用route.resolves处理页面授权,此链接有一个很好的示例:AngularJS $rootScope.$broadcast not working in app.run;

相关问题