我在尝试将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,我看起来可以通过错误。但我注意到路由器也使用它来初始化,有没有办法让路由器等我初始化?
答案 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;
});