2013-02-19 9 views
18

今、私の仕事は$ exceptionHandlerプロバイダーを書き換えてメッセージとモーダルダイアログを出力し、デフォルトイベントを停止させることです。私は何AngularJs/.provider/rootScopeにブロードキャストを取得する方法は?

:プロジェクトの初期化中

私は、メソッド.providerを使用します。

.provider('$exceptionHandler', function(){ 

//and here I would like to have rootScope to make event broadcast 

}) 

スタンダール注入方法では動作しません。

UPD:サンドボックス - http://jsfiddle.net/STEVER/PYpdM/

答えて

31

インジェクタを注入し、$ rootScopeを参照することができます。

デモplunkr:http://plnkr.co/edit/0hpTkXx5WkvKN3Wn5EmY?p=preview

myApp.factory('$exceptionHandler',function($injector){ 
    return function(exception, cause){ 
     var rScope = $injector.get('$rootScope'); 
     if(rScope){ 
      rScope.$broadcast('exception',exception, cause); 
     } 
    }; 
}) 

更新:あまりに .provider追加テクニック:これを行うの

app.provider('$exceptionHandler', function() { 
    // In the provider function, you cannot inject any 
    // service or factory. This can only be done at the 
    // "$get" method. 

    this.$get = function($injector) { 
    return function(exception,cause){ 
     var rScope = $injector.get('$rootScope'); 
     rScope.$broadcast('exception',exception, cause); 
    } 
    }; 
}); 
+0

これで問題は解決しましたが、プロバイダ設定(たとえば.providerの例:https://gist.github.com/Mithrandir0x/3639232)に '$ rootScope 'を注入する必要がある場合、このメソッドは機能しません。 – Webnet

+0

これはうまくいくようです。 http://plnkr.co/edit/svRUruKSzuLcBPAWa0ro?p=preview – checketts

+0

私はその時点ではできなかったと思いますが、今は 'this。$ get = function($ rootScope) 'afaik – Ellone

-2

あなたは$ rootScopeを注入する必要があります。

.provider('$exceptionHandler', '$rootScope', function(){ 

//and here I would like to have rootScope to make event broadcast 

}) 

は、あなたがしようとした何本か?もしそうなら、エラーメッセージやjsfillde/plnkrがあり、それがなぜ失敗したかを知ることができますか?

+0

私は標準方法は機能しません。 –

+0

はい、動作しない場合は、間違って使用しても目に見える効果がないか、エラーが発生します。 jsfiddleを作成すると、私たちがあなたを助けるのがずっと簡単になります。 – martijnve

+0

jsfiddleはすでに追加されています –

1

マイウェイ - デコレータを使用して、未知の上、前の例外ハンドラに戻しますエラー:

app.config(function ($provide) { 
    $provide.decorator('$exceptionHandler', function($delegate, $injector) { 
    return function (exception, cause) { 
     if (ICanHandleThisError) { 
     var rootScope= $injector.get('$rootScope'); 
     // do something (can use rootScope) 
     } else 
     $delegate(exception, cause); 
    }; 
    }); 
}); 
関連する問題