Dependency injection 角度2:动态组件加载和注入
我一直在Angular2中试验动态组件加载程序。一个可能与此相关的问题似乎是,一旦一个组件加载了loadIntoLocation()函数,注入器就无法找到父组件的注入器或注入其中的对象。正如那篇文章所建议的,您可以将从父级的注入器(injector.resolve)获得的已解析提供程序数组传递到loadIntoLocation()的最后一个参数中 这在一开始似乎是可行的,但我还发现动态加载组件的任何子级也有相同的问题。子项的注入器不知道如何在注入树中查找提供者,因此子项的构造函数中的标准注入类似于Dependency injection 角度2:动态组件加载和注入,dependency-injection,angular,Dependency Injection,Angular,我一直在Angular2中试验动态组件加载程序。一个可能与此相关的问题似乎是,一旦一个组件加载了loadIntoLocation()函数,注入器就无法找到父组件的注入器或注入其中的对象。正如那篇文章所建议的,您可以将从父级的注入器(injector.resolve)获得的已解析提供程序数组传递到loadIntoLocation()的最后一个参数中 这在一开始似乎是可行的,但我还发现动态加载组件的任何子级也有相同的问题。子项的注入器不知道如何在注入树中查找提供者,因此子项的构造函数中的标准注入类似
constructor( myComponent: MyComponent)
不起作用。(动态加载组件的)子级不是动态加载的,而是使用模板、选择器等“正常”实例化的。我想知道:
问题似乎是由传递到
loadToLocation()
的已解析提供程序引起的。DI是分层的,DI试图通过向根目录遍历层次结构来解析所需的类型,但链在loadToLocation()
处断开,因为传递的是提供程序而不是子注入器。动态添加的组件及其子组件只能解析传递到
loadToLocation()
或列在动态添加的组件本身的providers
列表中的提供程序(或其子组件之一,如果它是实际解析组件的(总)父级)
当DI从动态插入的树中向上移动以解决依赖关系时,迭代在通过loadToLocation()
添加的组件处停止,因为此组件的注入器没有父注入器(这将是添加动态添加组件的主机组件的注入器)
另请参见有关此问题的更正。我将代码中的另一个问题与我认为是上面描述的bug混为一谈。我的动态加载组件的子级是从抽象类派生的。我试图将抽象类注入到子类中,而不是实际的实现,根据这一点
我知道你做不到。注入树确实会在动态负载下被破坏(我认为应该纠正),但是我收回了关于孩子们以后不能遍历他们自己的树的部分。谢谢你的评论-它帮我整理了一下。谢谢你的链接-它似乎有更多的想法可以尝试。需要明确的是,根据我的经验,动态负载不仅会导致喷油器树被破坏,而且动态负载组件的所有后续子组件也无法沿着它们的树行走(这与您所说的略有不同)。每个孩子似乎都被放在自己的树上。因此,列出的解决办法需要以某种方式为每个孩子重复,这是站不住脚的。很高兴被证明是错的。。。我会看一看你的链接,看看能不能让它正常工作。谢谢。我还没有详细调查过。如果是如你所说,那么我认为这是一个错误,应该报告。不过,对于动态添加的元素,树被破坏是显而易见的,我想这将得到修复。