我一直在试验Angular2中的动态组件加载器。一个可能与此相关的问题:https://github.com/angular/angular/issues/4330,似乎是一旦组件加载了例如loadIntoLocation()函数,注入器就无法找到父组件的注入器或者那些东西。注入其中。正如该文章所建议的那样,您可以将从父级注入器(Injector.resolve)获取的已解析提供程序数组传递给loadIntoLocation()的最后一个参数。
这似乎最初起作用,但我也发现动态加载组件的任何 children 也有同样的问题。孩子们的注射器不知道为提供者查找注入树,所以在孩子的构造函数中标注注入
constructor( myComponent: MyComponent)
不起作用。子项(动态加载的组件)不是动态加载的,而只是"通常"使用模板,选择器等进行实例化。我想知道:
答案 0 :(得分:0)
问题似乎是由已解决的提供商传递给loadToLocation()
引起的。 DI是分层的,DI尝试通过将层次结构走向根来解决所需的类型,但链在loadToLocation()
被破坏,因为传递了提供者而不是子注入器。
动态添加的组件及其子组件只能解析传递给loadToLocation()
或在动态添加的组件本身的providers
列表中列出的提供程序(或者如果它是(祖父)父项实际解决的组件)。
当DI从动态插入的树中向上移动以解决依赖关系时,迭代将停止在由loadToLocation()
添加的组件处,因为此组件的注入器没有父注入器(这将是注入器)添加动态添加组件的主机组件的数量。)
答案 1 :(得分:0)
对此进行更正。我在我的代码中混淆了另一个问题,我认为是上面描述的错误。我动态加载的组件的子元素来自抽象类。我试图将抽象类注入到子项中,而不是实际的实现,按照这个
Interface based programming with TypeScript, Angular 2 & SystemJS
我知道你不能这样做。注入树确实在动态负载(我认为应该更正)时被破坏,但我收回了关于孩子的部分,此后无法遍历他们自己的树。感谢您的评论 - 它帮助我解决了问题。