2016-04-21 23 views
6

Ho un gestore di eccezioni personalizzato che dovrebbe portare l'utente a una pagina di errore personalizzata se si verifica un'eccezione (è sufficiente provarlo).Angular 2 Custom Error Handling and Router

Sto cercando di ottenere l'istanza del router utilizzando Injector. Motivo per farlo, credo che l'iniettore fornirà l'istanza del router esistente e usandolo sarò in grado di instradare l'utente.

Qualche idea sul perché questo non funziona o su come questo può essere ottenuto?

Grazie :)

@Injectable() 
export class AppExceptionHandler extends ExceptionHandler{ 

constructor(){ 
    super(null, null); 
} 

call(exception:any, stackTrace?:any, reason?:string):void { 
    console.log('call...') 


    var providers = Injector.resolve([ROUTER_PROVIDERS]); 
    var injector = Injector.fromResolvedProviders(providers); 

    // this is causing issue, not sure it is the correct way 
    let router : Router = injector.get(Router); 

    // not executed 
    console.log(router) 

    // not executed 
    console.log('done...') 
    router.navigate(["CustomErrorPage"]); 
    } 

} 

risposte - testato in 2.0.0-beta.17 Grazie alla Druxtan

 
1. Created a file app.injector.ts inside the app folder (app/app.injector.ts) 
let appInjectorRef; 

export const appInjector = (injector?) => { 
    if (!injector) { 
     return appInjectorRef; 
    } 

    appInjectorRef = injector; 

    return appInjectorRef; 
}; 
 
2. Added to the bootstrap in the main.ts 
bootstrap(AppComponent,[ROUTER_PROVIDERS, HTTP_PROVIDERS,provide(ExceptionHandler,{useClass : AppExceptionHandler})]) 
    .then((appRef) => appInjector(appRef.injector)); 
 
3. In the AppExceptionHandler, retrieved the Router instance as shown below 
export class AppExceptionHandler { 

    call(exception:any, stackTrace?:any, reason?:string):void { 

     let injectorApp = appInjector(); 
     let router = injectorApp.get(Router); 
     let localStorageService = injectorApp.get(LocalStorageService); 

     if(exception.message === '-1'){ 
      localStorageService.clear(); 
      router.navigate(["Login"]); 
     } 
    } 

} 
+0

Hai trovato una soluzione a questo problema? – Scipion

+0

Ciao aggiornato la domanda con risposta. :) – ssujan728

risposta

1

avrei implementare la funzione in questo modo dal momento che questa classe si svolge nel iniezione di dipendenza:

@Injectable() 
export class AppExceptionHandler extends ExceptionHandler { 
    constructor(private router:Router) { 
    super(null, null); 
    } 

    call(exception:any, stackTrace?:any, reason?:string):void { 
    console.log('call...') 

    this.router.navigate(['CustomErrorPage']); 
    } 
} 

e registrare il manico in questo modo:

bootstrap(MyApp, [ 
    provide(ExceptionHandler, {useClass: AppExceptionHandler}) 
]); 
+0

Grazie per il suggerimento Inizialmente è stato fatto in questo modo. Mi ha comunque dato problemi. Dal messaggio di errore sembrava che l'AppExceptionHandler sia inizializzato prima del Router, quindi non può essere iniettato. Ho provato anche questo 'bootstrap (MiaApp, [ROUTER_PROVIDERS, forniscono (ExceptionHandler, {useClass: AppExceptionHandler}) ]);' anche questo lavoro non ha ancora, è per questo che swithced a iniettore. – ssujan728