Angular:无法读取 null 的属性 'component'

标签 angular angular-ui-router

我有一个奇怪的问题。我有一个像这样的基本路由配置:

const appRoutes: Routes = [
  {path: '', redirectTo: '/search', pathMatch: 'full'},
  {path: 'login', component: LoginComponent },
  {path: 'dashboard', component: DashboardComponent, canActivate: [OnlyLoggedInGuard]},
  {path: 'search', component: SearchComponent, canActivate: [OnlyLoggedInGuard]}
];

在应用程序 HTML 上,我有条件地导入路由器 socket :

<div *nfIf="condition">
...
<router-outlet></router-outlet>
...
</div>
<div *nfIf="!condition">
... another dom construction
<router-outlet></router-outlet>
...
</div>

然后我拦截(使用 HttpInterceptor )HTTP 401 错误以重定向到登录页面。意思是在我的 http 拦截器中的某个时刻我有这个:

this._router.navigate(['/login', {error:'I am an error message'}]);

当我在仪表板上出现 401 时,我被正确地重定向到具有正确错误参数的登录页面。 但是,当我在登录页面上并从服务器收到 401 时,出现以下错误:

core.es5.js:1020 ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'component' of null
TypeError: Cannot read property 'component' of null
    at PreActivation.webpackJsonp.../../../router/@angular/router.es5.js.PreActivation.traverseRoutes (router.es5.js:4343)
    at router.es5.js:4305
    at Array.forEach (<anonymous>)
    at PreActivation.webpackJsonp.../../../router/@angular/router.es5.js.PreActivation.traverseChildRoutes (router.es5.js:4304)
    at PreActivation.webpackJsonp.../../../router/@angular/router.es5.js.PreActivation.traverse (router.es5.js:4261)
    at MapSubscriber.project (router.es5.js:4100)
    at MapSubscriber.webpackJsonp.../../../../rxjs/operator/map.js.MapSubscriber._next (map.js:77)
    at MapSubscriber.webpackJsonp.../../../../rxjs/Subscriber.js.Subscriber.next (Subscriber.js:89)
    at MergeMapSubscriber.webpackJsonp.../../../../rxjs/operator/mergeMap.js.MergeMapSubscriber.notifyNext (mergeMap.js:143)
    at InnerSubscriber.webpackJsonp.../../../../rxjs/InnerSubscriber.js.InnerSubscriber._next (InnerSubscriber.js:23)
    at PreActivation.webpackJsonp.../../../router/@angular/router.es5.js.PreActivation.traverseRoutes (router.es5.js:4343)
    at router.es5.js:4305
    at Array.forEach (<anonymous>)
    at PreActivation.webpackJsonp.../../../router/@angular/router.es5.js.PreActivation.traverseChildRoutes (router.es5.js:4304)
    at PreActivation.webpackJsonp.../../../router/@angular/router.es5.js.PreActivation.traverse (router.es5.js:4261)
    at MapSubscriber.project (router.es5.js:4100)
    at MapSubscriber.webpackJsonp.../../../../rxjs/operator/map.js.MapSubscriber._next (map.js:77)
    at MapSubscriber.webpackJsonp.../../../../rxjs/Subscriber.js.Subscriber.next (Subscriber.js:89)
    at MergeMapSubscriber.webpackJsonp.../../../../rxjs/operator/mergeMap.js.MergeMapSubscriber.notifyNext (mergeMap.js:143)
    at InnerSubscriber.webpackJsonp.../../../../rxjs/InnerSubscriber.js.InnerSubscriber._next (InnerSubscriber.js:23)
    at resolvePromise (zone.js:783)
    at resolvePromise (zone.js:754)
    at zone.js:831
    at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:424)
    at Object.onInvokeTask (core.es5.js:3881)
    at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
    at Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.runTask (zone.js:191)
    at drainMicroTaskQueue (zone.js:595)
    at ZoneTask.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (zone.js:502)
    at invokeTask (zone.js:1370)

最佳答案

好的。我设法解决了这个问题。我不完全理解,但这是我发现的:

  • Cannot read property 'component' of nullrouter-outlet 在应用程序 HTML 中仅包含一次时(例如:与包含相反ng-if 条件的每个分支中的 router-outlet)

  • 当我将 router-outlet 的条件包含从

  • 更改为

这种形式:

    <div *nfIf="condition">
        <router-outlet></router-outlet>
    </div>
    <div *nfIf="!condition">
        <router-outlet></router-outlet>
    </div>

到这个表格:

    <div *nfIf="condition;else notcondition">
        <router-outlet></router-outlet>
    </div>
    <ng-template #notcondition>
        <router-outlet></router-outlet>
    </ng-template>

我在使用参数从登录页面导航到登录页面时没有问题。

关于Angular:无法读取 null 的属性 'component',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45596139/

相关文章:

node.js - 在 Angular 5 中,如何导入没有 @types 的 NPM 模块

javascript - Angular ui 路由器 : child state controller not getting called

javascript - 在 Angular js 中使用 $stateProvider 进行路由,当尝试使用状态进行路由时,页面未加载

angularjs - UI-Router 多 View 单个 Controller 不起作用

angular - PrimeNg p-dialog 未集中在第一个显示器上

angular - 创建集中的异常处理以从未处理的异常中恢复

angular - 在页面之间导航时未调用 ngAfterViewInit

angular - 使用 Getter 和 Setter 的 Angular2 组件输入上出现重复标识符错误

angularjs - 如何让 AngularJS ui-router 正确响应浏览器页面刷新?

javascript - UI Router Params 值在目标中未定义