uirouter / angular-hybrid AoT构建bootstrapModuleFactory承诺注入器无法获取UIRouter

时间:2019-01-03 02:04:34

标签: angular-ui-router angular2-aot angular-hybrid

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

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);   
});

我确认jector.get(NgZone)将成功,并且jector.get(UIRouter)将失败。我尝试将调用移至NgZone运行函数内的jector.get(UIRouter),但未成功。

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

一个简单的angularjs组件可以很好地渲染,因此引导过程似乎可以成功,除了无法调用UIRouter.urlService上的listen()和sync()函数。

我还确认了对于同一示例应用程序的开发配置和非aot生产配置,不存在此问题,并且似乎工作正常。

使用版本:

uirouter / angular-hybrid v6.0.2

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

感谢任何想法。

1 个答案:

答案 0 :(得分:0)

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

用命名的导出替换默认的导出会触发AOT编译器抱怨未导出的函数引用。此外,导出该函数还可以成功构建,满意的注入器以及成功的运行时启动。