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