簡體   English   中英

沒有收到我工廠發出的$ rootScope事件

[英]Not receiving event from $rootScope emitted by my factory

我創建了一個工廠來提供自己的Angular $ exceptionHandler實現 該工廠在$ rootScope上發出一個事件,以通知偵聽器已發生錯誤。 我的監聽器在指令中定義,該指令正在監視$ rootScope。$ on事件。 就我的工廠實例攔截異常並發出錯誤事件而言,一切似乎都很好。 但是,假定正在監聽事件的指令從不接收該事件。 什么是導致此事件在指令中的偵聽器丟失的斷開連接?

澄清:事件完全依賴於$ rootscope的發射和消耗,以避免向下游廣播事件。 這是設計使然,以前已經起作用,或者至少看起來可以在我基於使用相同策略的多個實現編寫的httpLoader和httpErrorHandler中工作。 http://plnkr.co/edit/N0JwYJdxPLur4xYZTUP1?p=info

柱塞: http ://plnkr.co/edit/LDbRa0Ew255fOd0EunAq?p=preview

angular.module('demo.services',[]);
angular.module('demo.directives',[]);
angular.module('demo',['demo.services','demo.directives']);

angular.module('demo')
.controller('demoCtrl', function($scope){
  $scope.message="Generate Error";
  $scope.generateError =function(){
    var x;
    x.foo.oops = ':(';
  }
});

angular.module('demo.services')
.factory('$exceptionHandler', function () {
    var $injector = angular.injector(['ng']);
    return function errorCatcherHandler(exception, cause) {
      rootScope = $injector.get('$rootScope');
      rootScope.$emit("httpError",exception);
      console.error(exception);
    };
});


angular.module('demo.directives')
.directive('ngHttpError', ['$rootScope',
  function ($rootScope) {
    return {
      scope: {
        title: '@',
      },
      template: '<div ng-click="showError=false"' +
                'ng-show="showError">'+
                'ERROR! {{errorModel | json}}' + 
                '</div>',
      link: function ($scope) {
        var showError;

        $scope.showError = false;
        $scope.errorModel = {};
        showError = $scope.showError;

        var initScope = function(e,m){
          console.log(m);
          $scope.errorModel = m;
          $scope.showError=true;
        }
        $rootScope.$on("httpError", initScope);
      }
    };
  }
]);

angular.bootstrap(document,['demo']);

請記住, $emit()在范圍層次結構中向上發送事件,而$broadcast()在層次結構中向下發送事件。 由於$rootScope是“根”作用域(最高級別/節點),因此在此處使用$broadcast()將事件“向下”發送到子作用域是有意義的。

$emit() ,來自docs

通過作用域層次結構向上調度事件名稱,通知已注冊的$ rootScope.Scope偵聽器。

$broadcast() ,來自docs

向所有子范圍(及其子范圍)向下分配事件名稱,通知已注冊的$ rootScope.Scope偵聽器。

-更新:

我已經更新了您的$exceptionHandler以獲取注入$injector服務並執行$broadcast()而不是$emit() -這似乎可以解決問題:

angular.module('demo.services')
.factory('$exceptionHandler', function ($injector) {
    //var $injector = angular.injector(['ng']);
    return function errorCatcherHandler(exception, cause) {
      rootScope = $injector.get('$rootScope');
      rootScope.$broadcast("httpError",exception.message);
      console.error(exception);
    };
});

順便說一句,一個相關的問題/答案可以在這里看到: AngularJs / .provider /如何獲取rootScope進行廣播?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM