2017-12-05 3 views
0

$ http.defaultsリクエストエラー(主に400ステータスコード)を受け取った後にイベントをブロードキャストする必要がありますが、設定フェーズで$ rootScopeにアクセスできません。

コード:

var app = angular.module('app', []); 
app.config(['$httpProvider','$injector', function($httpProvider, $injector) { 
    $httpProvider.interceptors.push(['$q', function($q) { 
     return { 
      'responseError': function (rejection) { 
       /* 
       Doesn't work: 
       $rootScope = $injector.get("$rootScope"); 
       $rootScope.$emit("RESPONSE_ERROR"); 
       */ 
       return $q.reject(rejection); 
      } 
     }; 
    }]); 
}]); 
app.controller("Controller",function($scope){ 
    $scope.$on("RESPONSE_ERROR",function(event,params){ 
     alert("WORKING!"); 
    }); 
}); 

任意の提案ですか?ありがとう。

答えて

1

$rootScopeをカスタムインターセプタ機能に注入すると、次のコードを試すことができます。

var app = angular.module('app', []); 
app.config(['$httpProvider','$injector', function($httpProvider, $injector) { 
    $httpProvider.interceptors.push(['$rootScope', '$q', function($rootScope, $q) { 
     return { 
      'responseError': function (rejection) { 
       $rootScope.$broadcast('RESPONSE_ERROR', { 
        // Custom properties 
       }); 
       return $q.reject(rejection); 
      } 
     }; 
    }]); 
}]); 
+0

私は愚かな気がします。インターセプタ内に$ rootScopeを挿入するのを忘れました...ありがとうございました! – MagisterMundus

2

this answerで説明したような問題は、二つの異なるインジェクタがあるという事実によって引き起こされます。上のコードでは、$injectorはconfigフェーズで注入されたもので、サービスプロバイダを扱っています。

もう1

$rootScopeのようなサービスインスタンスへのアクセスを得るために、実行フェーズ中に噴射する必要があります別の答えは、すでに説明し

$httpProvider.interceptors.push(function($q, $injector) { ... }); 

として、$rootScopeは直接インターセプターに注入することができます。 $injectorは、インターセプタの循環依存を避け、そこに$httpを注入する一般的な方法です。

+0

あなたの答えをありがとう。残念ながら、@ Izagkaretosの答えは私の場合に働いたので、私は彼の答えを受け入れるでしょう。 – MagisterMundus

+0

問題ありません。それがなぜ起こるのか説明していませんが、それは正しいです。 – estus

関連する問題