2013-02-19 18 views
18

Ora il mio compito è di riscrivere il provider $ exceptionHandler in modo che emetta una finestra di dialogo modale con il messaggio e interrompa l'evento predefinito.AngularJs/.provider/come ottenere il rootScope per effettuare una trasmissione?

quello che faccio:

nel progetto init Io uso il metodo .provider: metodo inject

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

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

}) 

standart non funziona.

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

risposta

31

è possibile iniettare l'iniettore e ricerca il $ 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); 
     } 
    }; 
}) 

Aggiornamento: aggiungere .provider tecnica troppo:

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

Mentre questo ha risolto il problema, se avete bisogno di '$ rootScope' iniettato in una configurazione del provider (come l'esempio .provider qui: https://gist.github.com/Mithrandir0x/3639232) allora questo metodo non funziona. – Webnet

+0

Sembra funzionare bene. Ecco un plunkr con esso:. Http://plnkr.co/edit/svRUruKSzuLcBPAWa0ro?p=preview – checketts

+0

credo che potremmo non al momento, ma ora, si può solo fare 'questo $ get = function ($ rootScope) 'afaik – Ellone

-2

È necessario iniettare il $ rootScope:

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

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

}) 

E 'questo che si è tentato? E se sì, hai un messaggio di errore o un jsfillde/plnkr per vedere perché ha fallito?

+0

come ho detto standard modo non funziona. –

+0

Sì, ma se non funziona lo stai usando male causando l'assenza di effetti visibili o producendo un errore. Se crei un jsfiddle, sarà molto più facile per noi aiutarti. – martijnve

+0

jsfiddle è stato già aggiunto –

1

Il mio modo di fare questo - usando un decoratore e ritornare al gestore di eccezioni precedente sconosciuta errori:

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