我有一个角度4系统,允许插件模块(加载 systemjs
) . 它们被加载并编译"manually",为每个模块创建一个 NgModuleFactory
. 这是在应用程序启动时完成的,因为我需要动态地构建主菜单和设置组件 . 我还通过将 NgModuleFactory
实例传递给路径的 loadChildren
成员来以这种方式动态构建路由 .
在这些插件模块中,定义了一些组件,在主应用程序中将用于构建设置组件 . 因此,根设置组件包含插件模块的控件 . 这是在加载时动态完成的,使用 NgModuleFactory
,创建 NgModuleRef
,并使用instance属性获取ngmodule的实例,然后使用此时创建的注入器 . 问题是这些插件模块中定义的服务(应该是单例)会被实例化两次 . 据我了解,路由器创建自己的 NgModuleRef
,所以可能是它自己的注入器,所以此时有两个不同的注入器,每个注入器都将实例化一个服务 .
有没有人之前解决过这样的问题?我猜有两种可能性(理论上):
-
强制路由器以某种方式重用我之前创建的
NgModuleRef
. 我不知道这是否可行 . (后来编辑)我实际上找到了一个方法,通过角度路由器代码查找 . 似乎NgModuleRef
缓存在Route
本身的_loadedConfig
属性中 . 所以在创建路径并覆盖它们时,我也提供了这个属性 . 因此,当角度正常路由机制被触发时,角度路由器会检查此值,并且不会创建新的NgModuleRef
,也不会创建新的Injector . 它似乎是一个黑客,因为_loadedConfig
仅供内部使用 . -
试图以某种方式强制路由器以某种方式创建
NgModuleRef
(和注入器),并在动态创建设置组件时尝试重用相同的东西(注入器,NgModuleRef
) . 我也不知道该怎么做 .
或者也许有另一种方法来实现这一目标?