javascript - Angular Controller $on 仅在调用 $broadcast 的 Controller 中初始化时才会启动

标签 javascript angularjs events

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

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

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

其他 Controller 旨在像这样广播错误:

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);
        });
    };
}]);

我的问题是,如果没有将以下代码添加到每个广播 Controller ,这将无法工作:

$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>

难道没有别的办法吗?我宁愿不必在每个需要此错误处理的 Controller 中使用最后一段代码。当我删除它时,ErrorCtrl 永远不会收到该事件。

最佳答案

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

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.
    };
}]);

关于javascript - Angular Controller $on 仅在调用 $broadcast 的 Controller 中初始化时才会启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37997218/

相关文章:

javascript - Protractor 无法访问其类共享其他元素的特定元素

html - AngularJS 购物车应用 : Disable button when quantity < 2

jQuery 和清除事件监听器

Javascript - 淡入淡出显示 :none

javascript - nodejs写同步函数eg fs.readFileSync

javascript - 类型 'subtle' 上不存在属性 'typeof webcrypto'

javascript - 中继器中的重复项,跟踪没有帮助

javascript - TinyMCE 删除 ng-click 事件 Angularjs

amazon-web-services - 如何为 S3 触发的 AWS Lambda 函数指定附加参数

.net - 当用户单击 X(关闭程序)时,VB.NET 重载默认功能