2013-02-19 16 views
18

Teraz moim zadaniem jest przepisanie dostawcy $ exceptionHandler tak, aby wyprowadzało modalne okno dialogowe z komunikatem i zatrzymało domyślne zdarzenie.AngularJs/.provider/jak zdobyć rootScope do emisji?

Co robię:

w init projektu używam metody .provider: Metoda inject

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

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

}) 

standart nie działa.

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

Odpowiedz

31

Możesz wstrzyknąć wtryskiwacz i wyszukać $ rootScope.

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

Aktualizacja: dodać .provider technika też:

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

Podczas rozwiązywania tego problemu, jeśli potrzebujesz '$ rootScope' wprowadzonego do konfiguracji dostawcy (np. Przykładu .provider tutaj: https://gist.github.com/Mithrandir0x/3639232), ta metoda nie będzie działać. – Webnet

+0

Wygląda na to, że działa dobrze. Tutaj jest plunkr z: http://plnkr.co/edit/svRUruKSzuLcBPAWa0ro?p=preview – checketts

+0

Chyba nie mogliśmy w tym czasie, ale teraz, możesz po prostu zrobić 'this. $ Get = function ($ rootScope) 'afaik – Ellone

-2

trzeba wstrzyknąć $ rootScope:

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

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

}) 

Czy tego próbował? A jeśli tak, czy masz komunikat o błędzie lub jsfillde/plnkr, aby zobaczyć, dlaczego się nie udało?

+0

jak powiedziałem standard sposób nie działa. –

+0

Tak, ale jeśli to nie działa, oznacza to, że używasz go nieprawidłowo, powodując brak widocznego efektu lub błąd. Jeśli zrobisz jsfiddle, znacznie łatwiej nam będzie ci pomóc. – martijnve

+0

jsfiddle został już dodany –

1

Mój sposób to zrobić - za pomocą dekoratora i powraca do poprzedniego obsługi wyjątków na nieznany błędy:

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); 
    }; 
    }); 
}); 
Powiązane problemy