0

我有一个示例 uirouter/angular-hybrid 应用程序,使用 @ngtools/webpack AngularCompiler 插件成功构建并运行。我已经更新了 main.aot.ts 引导函数以使用 bootstrapModuleFactory 并且可以从 promise 成功处理程序中可用的 platformRef 获取注入器。但是injector.get(UIRouter) 失败并显示“无法读取属性'config' of null”。

platformBrowser().bootstrapModuleFactory(AppModuleNgFactory).then((platformRef) => {
  const urlService: UrlService = platformRef.injector.get(UIRouter).urlService;
  function startUIRouter() {
    urlService.listen();
    urlService.sync();
  }

  platformRef.injector.get<NgZone>(NgZone).run(startUIRouter);   
});

我确认 injector.get(NgZone) 会成功并且 injector.get(UIRouter) 会失败。我尝试将调用移动到 NgZone 运行函数内的 injector.get(UIRouter) 没有成功。

我还尝试将 upgrade.bootstrap 调用移动到上面的 promise success 函数中,以确保它首先启动,而没有解决问题。

一个简单的 angularjs 组件渲染良好,因此启动过程似乎成功了,只是无法调用 UIRouter.urlService 上的 listen() 和 sync() 函数。

我还确认了开发配置和非 aot 生产配置,对于同一个示例应用程序,没有这个问题,似乎工作正常。

使用版本:

uirouter/角度混合 v6.0.2

v7.1.4 的角度包,但在 6.0.0 中也失败了(这是 uirouter/angular-hybrid v6.0.2 文档中 package.json 中的角度版本)

感谢您的任何想法。

4

1 回答 1

0

问题是我传递给 UIRouterUpgradeModule.forRoot 的配置对象是从使用该对象的默认导出的文件导入的,并且该对象具有对未导出的配置函数的引用。这种组合在构建过程中隐藏了问题,并导致在运行时没有 UIRouter 对象可用于注入器的症状。

用命名导出替换默认导出会触发 AOT 编译器抱怨未导出的函数引用。此外,导出该函数允许成功构建、愉快的注入器和成功的运行时引导。

于 2019-01-03T19:07:05.020 回答