2017-05-09 22 views
6

Yönlendirme sırasında bir bileşenden (yapıcı veya ngOnInit) yakalanmamış bir hata varsa, gezinme artık çalışmaz.Açısal 4 + zonejs: yönlendirme, yakalama hatasından sonra çalışmayı durdurur

Bu küresel errorHandler ve RouterModule için bir errorHandler olsa bile olur, hem de emin olmak için bir ZoneListener eklendi - app.module.ts

burada

Minimal örnek bkz: https://embed.plnkr.co/L19S3hKWyqgKUIT1EJlI/preview

Hale Getir konsolu açmak istediğinizden emin olun. "Örnek Bileşen" e tıkladıktan sonra, ÖrnekFormComponent öğesindeki zorunlu hatanın bir sonucu olarak bazı yığınlar vardır. Bundan sonra "Ana Sayfa" ya geri gidemezsiniz.

Tüm uygulamayı bozmadığından emin olmak için beklenmeyen, yakalanmamış hatalar nasıl ele alınır?

ben gibi bazı geçici çözüm yapacağını
+0

Giriş Bu [sorunu] deneyebilirsiniz (https://github.com/angular/angular/issues/2413). Muhtemelen – PierreDuc

+0

@PierreDuc 'un bir sonraki versiyonunda sabitlenecektir. 4.1.1 versiyonunu plunker – yurzui

+0

@PierreDuc olarak ayarlayabilirsiniz: yurzui, 4.1.1 problemi bile –

cevap

2

:

let hasRouterError = false; 
@Injectable() 
export class MyErrorHandler implements ErrorHandler { 
    constructor(private inj: Injector) {} 

    handleError(error: any): void { 
    console.log('MyErrorHandler: ' + error); 

    if(hasRouterError) { 
     let router = this.inj.get(Router); 
     router.navigated = false; 
    } 

    //throw error; // it is necessarily otherwise handleError won't be executed during next error 
    } 
} 

export function MyRouterErrorHandler(error: any) { 
    console.log('RouterErrorHandler: ' + error); 
    hasRouterError = true; 
    throw error; 
} 

ve biz özel RouteReuseStrategy kullanmak zorunda:

Bu kodu

if(hasRouterError) { 
    hasRouterError = false; 
    return false; 
} 

DefaultRouteReuseStrategy tek farklılık

export class PreventErrorRouteReuseStrategy implements RouteReuseStrategy { 
    shouldDetach(route: ActivatedRouteSnapshot): boolean { return false; } 
    store(route: ActivatedRouteSnapshot, detachedTree: DetachedRouteHandle): void {} 
    shouldAttach(route: ActivatedRouteSnapshot): boolean { return false; } 
    retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle|null { return null; } 
    shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean { 
    if(hasRouterError) { 
     hasRouterError = false; 
     return false; 
    } 
    return future.routeConfig === curr.routeConfig; 
    } 
} 

sağlayıcılara arr eklemek için ihmal etmeyin ay:

import { RouteReuseStrategy } from '@angular/router'; 
... 
{ provide: RouteReuseStrategy, useClass: PreventErrorRouteReuseStrategy }, 

Sen Modified Plunker

+0

yurzui olarak kalıyor, zaten bıktım ama 'mustReuseRoute'un girişine tökezledim. Doktorun onları gelecek gibi yazdığını biliyorum, curr ama bu hatta bir hata ayıklayıcısını koyarsanız ve 'evden' türüne 'örneğin' geldiğinde, 'future.routeConfig' 'ev' olur. Ters değil mi? – echonax

+0

Tuhaf @echonax ama varsayılan stratejisi http://take.ms/DpW8O ile aynı davranışı hiç önemli değil gözlemleyebilirsiniz 'future.routeConfig === curr.routeConfig' veya' curr.routeConfig === gelecek. o amaçlanan veya eğer routeConfig' https://github.com/angular/angular/blob/4.1.1/packages/router/src/router.ts#L198-L206 – yurzui

+0

Evet evet, ben sadece merak bir hata: D – echonax

İlgili konular