2017-05-09 55 views
6

如果從一個組件(構造函數或ngOnInit)路由導航不會再後來工作期間未被捕獲的錯誤。角4個+ zonejs:路由停止未被捕獲的錯誤後,工作

出現這種情況即使是一個全球性的ErrorHandler,爲RouterModule設置ErrorHandler,增加了一個ZoneListener可以肯定,以及 - 見app.module.ts

小例子,在這裏: https://embed.plnkr.co/L19S3hKWyqgKUIT1EJlI/preview

製作一定要打開控制檯。一旦你點擊了「示例組件」,由於ExampleFormComponent中的強制錯誤導致一些堆棧跟蹤。之後,您將無法導航回「主頁」。

如何處理突發性,未被捕獲的錯誤,以確保它們不會打破整個應用程序?

+0

檢查這個[問題](https://github.com/angular/angular/issues/2413)。可能會在下一個版本中修復 – PierreDuc

+0

@PierreDuc我認爲這沒有幫助。您可以在plunker – yurzui

+0

@PierreDuc設置4.1.1版本:yurzui是正確的,即使4.1.1問題仍然存在 –

回答

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

,我們必須定製RouteReuseStrategy使用:

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

它從DefaultRouteReuseStrategy只有一個不同,該代碼

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

不要忘記將其添加到提供商arr AY:

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

,您可以嘗試在Modified Plunker

+0

yurzui,我已經upvoted,但我偶然發現shouldReuseRoute'的'輸入。我知道doc會將它們寫成未來的curr,但如果您將調試器放在該行並從'home'導航到'about',例如'future.routeConfig'就會變成'home'。它不是逆轉嗎? – echonax

+0

@echonax很奇怪,但你可以看到默認的策略http://take.ms/DpW8O相同的行爲也沒關係'future.routeConfig === curr.routeConfig'或'curr.routeConfig ===未來。 routeConfig' https://github.com/angular/angular/blob/4.1.1/packages/router/src/router.ts#L198-L206 – yurzui

+0

是啊是啊,我只是想知道,如果這是有意或錯誤:d – echonax

相關問題