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

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

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

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

  • 试图以某种方式强制路由器以某种方式创建 NgModuleRef (和注入器),并在动态创建设置组件时尝试重用相同的东西(注入器, NgModuleRef ) . 我也不知道该怎么做 .

或者也许有另一种方法来实现这一目标?