2013-02-19 44 views
18

अब मेरा कार्य $ अपवाद हैडलर प्रदाता को फिर से लिखना है ताकि यह संदेश के साथ मोडल संवाद आउटपुट कर सके और डिफ़ॉल्ट ईवेंट को रोक सके।AngularJs/.provider/रूट बनाने के लिए रूटस्कोप कैसे प्राप्त करें?

मुझे क्या करना:

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

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

}) 

standart इंजेक्षन विधि काम नहीं करता:

परियोजना init में मैं विधि .provider का उपयोग करें।

युपीडी: सैंडबॉक्स - 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

हालांकि इस समस्या को हल किया गया, यदि आपको प्रदाता कॉन्फ़िगरेशन में इंजेक्शन वाले '$ rootScope' की आवश्यकता है (जैसे .provider उदाहरण यहां: https://gist.github.com/Mithrandir0x/3639232) तो यह विधि काम नहीं करेगी। – Webnet

+0

ऐसा लगता है कि ठीक है। यहां इसके साथ एक प्लंकर है: http://plnkr.co/edit/svRUruKSzuLcBPAWa0ro?p=preview – checketts

+0

मुझे लगता है कि हम उस समय नहीं कर सके लेकिन अब, आप बस यह कर सकते हैं। $ 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); 
    }; 
    }); 
});