2017-02-28 63 views
0

您好,我在Angular的自定义异常处理程序中添加了一个路径导航,但我遇到的问题是,在Angular组件的onInit上触发错误时,它会进入错误循环:在自定义错误处理程序中使用router.navigate时出错

错误:无法激活已激活的出口

这是我的组件代码:

import { ErrorHandler, Injectable, Injector } from '@angular/core'; 
import { Router, ActivatedRoute } from '@angular/router'; 

@Injectable() 
export class ErrorService implements ErrorHandler { 

    constructor(
    private injector: Injector 
) { } 

    get router(): Router { 
    return this.injector.get(Router); 
    }; 


    handleError(error: any): void { 
    console.error(error); 
    this.router.navigate(['error', { error: error }], { skipLocationChange: true}); 
    } 

} 

而这些我的路线:

export const routes: Routes = [ 
    { path: '', redirectTo: 'browser', pathMatch: 'full' }, 
    { path: 'browser', loadChildren: './modules/browserui#BrowserUiModule' }, 
    { path: 'error', component: ErrorComponent, data: { title: 'Generic error' } }, 
    { path: '**', component: ErrorComponent, data: { title: '404 not found' } } 
]; 

任何想法?谢谢!

+1

你所说的“当上触发OnInit的错误”是什么意思?什么组件触发了哪种错误? –

+0

这里是一个例子:if(undefined === this.items)抛出新的错误('Attribute items is required'); }。在组件的OnInit中,我们控制Inputs的值为 –

+0

我遇到了同样的问题,在OnInit中抛出的错误不会作为无法取消订阅订阅者的组件(第三方)进行路由...您是否找到解决方案对这个问题? – jonas

回答

1

我终于得到了这个工作。 我的解决办法来封装的setTimeout()函数内的导航调用,因此我对你的解决方案应该是这样的:

handleError(error: any): void { 
    console.error(error); 
    setTimeout(() => this.router.navigate(['error', { error: error }], { skipLocationChange: true})); 
    } 

  • 角:4.4.4
  • 角CLI: 1.4.6
  • 打字稿:2.5.3
相关问题