角度控制器$ on仅在控制器调用$ broadcast时初始化时才会启动

时间:2016-06-23 16:34:17

标签: javascript angularjs events

我正在尝试创建一个控制器来获取错误消息并处理它们:

ngLogin.controller('ErrorCtrl', ['$scope', '$rootScope', function($scope, $rootScope) {
  $scope.$on('ngError', function(event, args) {
    $scope.displayErrors(args);
  });

  $scope.displayErrors = function(errors) {
    alert(errors);
  }
}]);

其他控制器的意思是广播错误:

ngLogin.controller('LoginCtrl', ['$scope', 'LoginService', '$controller', '$rootScope', function($scope, LoginService, $controller, $rootScope) {
    $scope.login = function(callback) {
        LoginService.login($scope.user.username, $scope.user.password, function(token) {
            //SUCCESS
        }, function(errors) {
            $rootScope.$broadcast('ngError', errors);
        });
    };
}]);

我的问题是,如果没有为每个广播控制器添加以下代码,这将无效:

$scope.ErrorCtrl = $scope.$new();
$controller('ErrorCtrl', {
    $scope: $scope.ErrorCtrl
});

的index.html

<script src="app.js"></script>
<script src="../src/LoginService.js"></script>
<script src="../src/LoginCtrl.js"></script>
<script src="../src/ErrorCtrl.js"></script>

没有其他办法吗?我宁愿不必在需要此错误处理的EVERY控制器中使用最后一段代码。当我删除它时,ErrorCtrl永远不会收到该事件。

1 个答案:

答案 0 :(得分:2)

我会说创建服务将负责显示错误消息&amp;在应用程序运行阶段有一个事件监听器代码。

app.run(function($rootScope, errorService){
   //listner here
   $rootScope.$on('ngError', function(event, args) {
    $scope.displayErrors(args);
  });
});
app.service('errorService', function(){
   var errorService = this;
   errorService.displayErrors = function(errors){
       alert(errors)
   };
})

或者更方便的方法是调用服务displayErrors方法,以便随时显示错误消息,从而可以从应用程序中消除基于事件的方法。

ngLogin.controller('LoginCtrl', ['$scope', 'LoginService', '$controller', '$rootScope', 'errorService', function($scope, LoginService, $controller, $rootScope, errorService) {
    $scope.login = function(callback) {
        LoginService.login($scope.user.username, $scope.user.password, function(token) {
            //SUCCESS
        }, errorService.displayErrors); //call display error method here.
    };
}]);