来自延迟加载模块的Angular 4动态插件组件

时间:2017-10-16 11:34:33

标签: angular systemjs angular-router

我有一个角度4系统,允许插件模块(加载systemjs)。它们被加载和编译"手动",为每个模块创建NgModuleFactory。这是在应用程序启动时完成的,因为我需要动态地构建主菜单和设置组件。我还通过将NgModuleFactory实例传递给路由的loadChildren成员,以这种方式动态构建路由。

在这些插件模块中,定义了一些组件,在主应用程序中将用于构建设置组件。因此,根设置组件包含插件模块的控件。这是在加载时动态完成的,使用NgModuleFactory,创建NgModuleRef,并使用instance属性获取ngmodule的实例,然后使用此时创建的注入器。问题是这些插件模块中定义的服务(应该是单例)会被实例化两次。据我所知,路由器创建自己的NgModuleRef,所以可能是它自己的注入器,所以此时有两个不同的注入器,每个注入器都会实例化一个服务。

以前有人解决过这样的问题吗?我猜有两种可能性(理论上):

  • 强制路由器以某种方式重用我之前创建的NgModuleRef。我不知道这是否可行。 (后来编辑)我实际上找到了一个方法,通过角度路由器代码查找。似乎NgModuleRef缓存在_loadedConfig本身的Route属性中。所以在创建路径并覆盖它们时,我也提供了这个属性。因此,当角度正常路由机制被触发时,角度路由器会检查此值,并且不会创建新的NgModuleRef,也不会创建新的Injector。这似乎是一个黑客,因为_loadedConfig仅供内部使用。
  • 尝试以某种方式强制路由器以某种方式创建NgModuleRef(和注入器),并在动态创建设置组件时尝试重用相同的东西(注入器,NgModuleRef)。我也不确定该怎么做。

或许还有另一种方法可以实现这一目标?

0 个答案:

没有答案