无法读取未定义的属性'initialNavigation' - Angular v4 AoT

时间:2017-04-20 03:45:30

标签: angular angular2-routing

我在尝试将AoT改装到现有应用程序时遇到了一些问题。我收到了这个错误:

Cannot read property 'initialNavigation' of undefined
RouterInitializer.webpackJsonp.1.RouterInitializer.isLegacyDisabled

这大致与我的AppModule类似:

@NgModule({
  imports: [
    RouterModule.forRoot(routes, {
      useHash: true,
      enableTracing: true,
      initialNavigation: true,
    }),
  ],
  declarations: [
    AppComponent,
  ],
  exports: [
    AppComponent,
  ],
  providers: [
    Http,
    ConfigService,
    {
      provide: APP_INITIALIZER,
      useFactory: configServiceFactory,
      multi: true,
      deps: [Http, ConfigService],
    },
  ],
  bootstrap: [
    AppComponent,
  ],
})
export class AppModule { }

似乎未定义路由器,并且当此代码路径运行时路由器选项未定义:RouterInitializer.isLegacyDisabled从路由器模块中的appInitializer调用。

我不知道该做什么。我觉得在APP_INITIALIZER承诺完成之前路线正在解决。

这似乎在JIT中工作正常,但AOT并发症很糟糕。如果您需要更多详细信息,请告诉我们。

编辑:如果我注释掉APP_INITIALIZER,我看起来可以通过错误。但我注意到路由器也使用它来初始化,有没有办法让路由器等我初始化?

1 个答案:

答案 0 :(得分:2)

APP_INITIALIZER导致此问题,因为路由器现在挂接它。

解决方案是根本不使用它来引导配置,路由器可以通过将其设置initialNavigation更改为false来手动启动它。

RouterModule.forRoot(routes, {
  initialNavigation: false,
}),

所以我将APP_INITIALIZER提供程序移动到app.component.ts

constructor(
    private router: Router,
    private http: Http,
    private configService: ConfigService,
) {
    // initialise routes once config is loaded
    configServiceFactory(http, configService).subscribe(() => router.initialNavigation());
}

注意:configServiceFactory基本上是这样的:

return http.get('config.json') // or your remote config service
    .map(m => m.json())
    .do(config => configService.setAppConfig(config)) // store it somewhere
    .catch(err => {
        console.error('Error getting config for app initialisation', err);
        return err;
    });