2017-05-09 11 views
6

ルーティング中にコンポーネント(コンストラクタまたはngOnInit)からキャッチされないエラーが発生した場合、ナビゲーションはそれ以降は機能しません。グローバルにErrorHandlerとRouterModuleのためのErrorHandlerがあっても角度4 + zonejs:キャッチされていないエラーの後にルーティングが機能しなくなる

この問題が発生し、同様に確かにZoneListenerを追加 - ここapp.module.ts

に最小限の例を参照してください。 https://embed.plnkr.co/L19S3hKWyqgKUIT1EJlI/preview

メイクを必ずコンソールを開きます。 「Example Component」をクリックすると、ExampleFormComponentの強制エラーの結果としていくつかのスタックトレースが発生します。その後、「ホーム」に戻ることはできません。

予期せぬキャッチされていないエラーを処理して、アプリ全体を破壊しないようにするにはどうすればよいですか?

+0

でそれを試すことができます。おそらく次のバージョンで修正されるだろう – PierreDuc

+0

@PierreDuc私はそれが役に立たないと思う。 plankerに4.1.1のバージョンを設定することができます – yurzui

+0

@PierreDuc: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 }, 

あなたはこの[問題](https://github.com/angular/angular/issues/2413)を確認Modified Plunker

+0

yurzui、私はすでにupvotedしましたが、私は 'shouldReuseRoute'の入力を見つけました。私は、将来のcurrとしてドキュメントを書いていることを知っていますが、その行にデバッガを置き、 'home'から' about'にナビゲートすると、 'future.routeConfig'は' home'になります。それは逆転していませんか? – echonax

+0

@echonaxこれは奇妙ですが、デフォルト戦略http://take.ms/DpW8Oで同じ動作を観察できます。future.routeConfig === curr.routeConfig'または 'curr.routeConfig === future。 routeConfig' https://github.com/angular/angular/blob/4.1.1/packages/router/src/router.ts#L198-L206 – yurzui

+0

そうだね、それが意図されているのか不具合なのか疑問に思うだけです:D – echonax

関連する問題