所以我有这部分应用程序结构,我要实现的行为是:我想在用户尝试未经授权访问路由时启动一个事件,然后在{{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
。
导致此问题的原因是什么?我可以将其恢复原状吗?
答案 0 :(得分:0)
嗯,这里发生的事情是角度控制器必须绑在元素或页面上(通过ng-controller属性或预定义的路由 - 在你的情况下&#34; / login&#34;)。
因此,根据您的示例,LoginCtrl尚未实例化,因此它无法将侦听器添加到该事件,甚至一旦它被销毁[控制器],侦听器将也走了。所以我认为这不是最好的策略。
你有几个选择: A)拥有这个&#34;听众&#34;在根控制器上,它将始终在整个应用程序中实例化,例如 AppController ,和/或 B)使用route.resolves处理页面授权,此链接有一个很好的示例:AngularJS $rootScope.$broadcast not working in app.run;