2017-09-18 3 views
4

d'application angulaire 4.ngOnInit ne fonctionne pas sur le composant page d'erreur

Je suis en train de faire une page d'erreur afin de montrer des informations sur l'exception non gérée qui peut se produire. Les GlobalErrorHandler intercepte les erreurs éventuelles et redirige l'utilisateur vers une page composée d'un seul ErrorComponent. Lorsque l'erreur se produit, la page est affichée, mais les accroches du cycle de vie ne sont pas appelées.

ErrorHandler:

@Injectable() 
export class GlobalErrorHandler extends ErrorHandler { 

    constructor(
     private injector: Injector 
    ) { 
     // The true paramter tells Angular to rethrow exceptions, so operations like 'bootstrap' will result in an error 
     // when an error happens. If we do not rethrow, bootstrap will always succeed. 
     super(true); 
    } 

    handleError(error: any) { 
     const router = this.injector.get(Router); 

     if (!router.url.startsWith('/error')) { 
      router.navigate(['/error']); 
     } 

     super.handleError(error); 
    } 

} 

ErrorComponent:

@Component({ 
    selector: 'error-desc', 
    template: '<h1>Error page = {{code}}</h1>' 
    changeDetection: ChangeDetectionStrategy.OnPush 
}) 
export class ErrorComponent implements OnInit { 
    public code: string = ''; 

    constructor(
    ) {} 

    ngOnInit() { 
     // not called 
     this.code="AAAA"; 
     console.log("OnInit"); 
    } 

    ngOnDestroy() { 
     console.log("OnDestroy"); 
    } 
} 

travail démo sur plunkr.

Comment puis-je résoudre ce problème? Peut-être que quelqu'un sait solution de contournement? Merci

+2

mis Votre code s'il vous plaît –

+0

Le code est en planker. Voir le lien dans la description – Albert

+0

@Albert Je rencontre le même problème après la mise à niveau de 4.1 à 4.4. BTW Vous devez inclure le code dans votre question, pas un site Web externe, voir [Comment poser une bonne question] (https://stackoverflow.com/help/how-to-ask): "* S'il est possible de créer un exemple vivant du problème que vous pouvez créer un lien vers (par exemple, sur http://sqlfiddle.com/ ou http://jsbin.com/), puis le faire -. mais aussi inclure le code dans votre question elle-même pas tout le monde peuvent accéder à des sites externes, et les liens peuvent se briser au fil du temps. * » – n00dl3

Répondre

3

Après avoir trouvé this github issue. Il semble que vous avez juste à exécuter votre code router.navigate(...) dans la zone de angulaire pour obtenir la mise de redirection et le fonctionnement:

ErrorHandler:

@Injectable() 
export class GlobalErrorHandler extends ErrorHandler { 

    constructor(private injector: Injector private zone: NgZone) { 
     super(); 
    } 

    handleError(error: any) { 
     const router = this.injector.get(Router); 
     super.handleError(error); 
     if (!router.url.startsWith('/error')) { 
      this.zone.run(()=>router.navigate(['/error'])); 
     } 
    } 

} 
+0

merci! C'est un travail, le problème est résolu) – Albert

+0

Intéressant, la méthode 'handleError' s'exécute en dehors de' zone' –