angular - 在自定义错误处理程序中使用 router.navigate 时出错

标签 angular angular2-routing

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

错误:无法激活已激活的 socket

这是我的组件的代码:

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

有什么想法吗?谢谢!

最佳答案

@jonas 和其他人,我实际上找到了一种在全局错误处理程序中执行此操作的更好方法。我们甚至不需要 setTimeout,这在我的例子中是不够的,因为它是部分路由(它是路由,但前一页的一部分保留在屏幕上,有点奇怪)。

无论如何,我找到了一个 GitHub post在 Angular 仓库中,它说要使用 zone。所以在我的例子中,我想捕获 401 并重定向到登录页面,代码就这么简单:

handleError(error: any) {
   console.error(error);
   if (error.status === 401) {
     zone.run(() => router.navigate(['/login']));
   }
}

现在它按预期工作,没有任何副作用。

关于angular - 在自定义错误处理程序中使用 router.navigate 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42503127/

相关文章:

typescript - 获取根组件 ElementRef 或 ComponentRef angular 2

html - ngx-bootstrap 轮播中的响应式更改

javascript - 循环进入包含对象的可观察数组错误: Cannot find a differ supporting object '[object Object]'

javascript - Angular 2 子路由未解决

javascript - Angular2 将导航限制在应用程序内

angular - 需要从 Angular 7 路由器中的路由获取参数

angular - 如何将代码片段放入 Angular 5 *.component.html

javascript - 从 RXJS observable 获取中间数据的最佳方式

html - li 在 Angular 中路由到不同的 html 页面时不会消失,为什么?

angular - 如何在 Angular 2 中定义嵌套的子路由?