【发布时间】:2017-07-24 07:29:37
【问题描述】:
我目前正在使用 Angular 4 的异步编译器来动态加载外部模块并使用 NgComponentOutlet 将其组件之一添加到 DOM 中。外部模块意味着在功能上与主应用程序脱节,因此它应该有自己的、唯一的依赖注入器(或者更确切地说,一个无法访问父模块提供者的注入器)。但是,如果我使用 ReflectiveInjector.resolveAndCreate 创建一个新的依赖注入器,NgComponentOutlet 会失败并显示错误 No provider for NgModuleRef!。
通过 NgComponentOutlet 进行一些跟踪后,这似乎是因为 NgModuleFactory 依赖于渲染器等来创建组件。但是,我一直无法找到一个 API 来公开一个最小的依赖注入器,类似于提供给根模块的那个。有没有办法获得这个注入器,或者创建一个最小的依赖注入器,它仍然包含渲染动态编译组件所需的资源?
【问题讨论】:
-
显示您的相关代码,_ 加载一个外部模块并使用 NgComponentOutlet 将其添加到 DOM 中。_ - 您的意思是从中添加组件吗?你不能将模块添加到
ngComponentOutlet -
相反,外部模块是使用编译器的注入实例编译的。编译后的模块被提供给 ngComponentOutlet,它从中构造其组件之一。
<ng-container *ngComponentOutlet="component; ngModuleFactory: moduleFactory; injector: injector"></ng-container> -
有趣,我不使用
*ngComponentOutlet,所以不知道他们引入了该功能。根注入器包含许多应用程序范围的提供程序,例如ApplicationRef、ErrorHandler、rendererFactory等,因此您无法完全避免它 - 否则您的任何组件都无法访问它们。为什么你希望你的组件不能访问父注入器提供者? -
这对程序的运行并不重要,但我想尽可能保持隔离。由于子模块对父应用程序知之甚少,我想为它提供一个关于依赖注入的完全干净的状态。由于期望父母和孩子都使用注入令牌,因此肯定有可能发生冲突。我希望有某种方法可以获取一个包含所有全局提供程序的注入器,而不是应用程序模块引入的任何提供程序,类似于根模块本身。
-
知道了,请参阅my answer。如果有不清楚的地方请告诉我。
标签: angular dependency-injection