2013-02-19 6 views
18

Jetzt ist meine Aufgabe, $ Ausnahme-Handler-Provider neu zu schreiben, so dass es modalen Dialog mit Nachricht ausgeben und Standard-Ereignis zu stoppen.AngularJs/.provider/Wie bekomme ich das rootScope um eine Sendung zu machen?

Was ich mache:

in Projekt init verwende ich Methode .provider:

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

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

}) 

standart inject Methode funktioniert nicht.

UPD: Sandbox - http://jsfiddle.net/STEVER/PYpdM/

Antwort

31

Sie können den Injektor injizieren und das $ rootScope nachschlagen.

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

Update: hinzufügen .provider Technik zu:

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

Während dies das Problem behoben hat, wird diese Methode nicht funktionieren, wenn Sie das $ rootScope benötigen, das in eine Provider-Konfiguration eingefügt wird (zB das .provider Beispiel hier: https://gist.github.com/Mithrandir0x/3639232). – Webnet

+0

Es scheint in Ordnung zu sein. Hier ist ein Plunkr damit: http://plnkr.co/edit/svRUruKSzuLcBPAWa0ro?p=preview – checketts

+0

Ich denke, wir konnten zu der Zeit nicht, aber jetzt können Sie einfach 'this machen. $ Get = function ($ rootScope) 'afaik – Ellone

-2

Sie müssen die $ rootScope injizieren:

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

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

}) 

Ist das, was Sie versucht? Und wenn ja, haben Sie eine Fehlermeldung oder eine jsfillde/plnkr, um zu sehen, warum es fehlgeschlagen ist?

+0

wie ich Standard sagte Art und Weise funktioniert nicht. –

+0

Ja, aber wenn es nicht funktioniert, verwenden Sie es entweder falsch oder verursachen keinen sichtbaren Effekt oder es sollte ein Fehler auftreten. Wenn Sie ein Spiel machen, wird es viel einfacher für uns, Ihnen zu helfen. – martijnve

+0

jsfiddle wurde bereits hinzugefügt –

1

Mein Weg, dies zu tun - mit einem Dekorateur und Rückkehr zu den vorherigen Exception-Handler auf unbekannt Fehler:

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); 
    }; 
    }); 
}); 
Verwandte Themen