Dependency injection 角度2:动态组件加载和注入

Dependency injection 角度2:动态组件加载和注入,dependency-injection,angular,Dependency Injection,Angular,我一直在Angular2中试验动态组件加载程序。一个可能与此相关的问题似乎是,一旦一个组件加载了loadIntoLocation()函数,注入器就无法找到父组件的注入器或注入其中的对象。正如那篇文章所建议的,您可以将从父级的注入器(injector.resolve)获得的已解析提供程序数组传递到loadIntoLocation()的最后一个参数中 这在一开始似乎是可行的,但我还发现动态加载组件的任何子级也有相同的问题。子项的注入器不知道如何在注入树中查找提供者,因此子项的构造函数中的标准注入类似

我一直在Angular2中试验动态组件加载程序。一个可能与此相关的问题似乎是,一旦一个组件加载了loadIntoLocation()函数,注入器就无法找到父组件的注入器或注入其中的对象。正如那篇文章所建议的,您可以将从父级的注入器(injector.resolve)获得的已解析提供程序数组传递到loadIntoLocation()的最后一个参数中

这在一开始似乎是可行的,但我还发现动态加载组件的任何子级也有相同的问题。子项的注入器不知道如何在注入树中查找提供者,因此子项的构造函数中的标准注入类似于

   constructor( myComponent: MyComponent)
不起作用。(动态加载组件的)子级不是动态加载的,而是使用模板、选择器等“正常”实例化的。我想知道:

  • 这(仍然)是一个已知的问题还是我误解了什么
  • 如果存在已知问题,在子级是否有解决方法?我尝试了如上所述的构造函数,还使用了@Host,还使用了forward ref+@Host,但都不起作用。是否有其他方法可以手动将绑定传递给未动态加载的组件
  • 是否有其他可能的解决方法

  • 问题似乎是由传递到
    loadToLocation()
    的已解析提供程序引起的。DI是分层的,DI试图通过向根目录遍历层次结构来解析所需的类型,但链在
    loadToLocation()
    处断开,因为传递的是提供程序而不是子注入器。
    动态添加的组件及其子组件只能解析传递到
    loadToLocation()
    或列在动态添加的组件本身的
    providers
    列表中的提供程序(或其子组件之一,如果它是实际解析组件的(总)父级)

    当DI从动态插入的树中向上移动以解决依赖关系时,迭代在通过
    loadToLocation()
    添加的组件处停止,因为此组件的注入器没有父注入器(这将是添加动态添加组件的主机组件的注入器)


    另请参见有关此问题的更正。我将代码中的另一个问题与我认为是上面描述的bug混为一谈。我的动态加载组件的子级是从抽象类派生的。我试图将抽象类注入到子类中,而不是实际的实现,根据这一点


    我知道你做不到。注入树确实会在动态负载下被破坏(我认为应该纠正),但是我收回了关于孩子们以后不能遍历他们自己的树的部分。谢谢你的评论-它帮我整理了一下。

    谢谢你的链接-它似乎有更多的想法可以尝试。需要明确的是,根据我的经验,动态负载不仅会导致喷油器树被破坏,而且动态负载组件的所有后续子组件也无法沿着它们的树行走(这与您所说的略有不同)。每个孩子似乎都被放在自己的树上。因此,列出的解决办法需要以某种方式为每个孩子重复,这是站不住脚的。很高兴被证明是错的。。。我会看一看你的链接,看看能不能让它正常工作。谢谢。我还没有详细调查过。如果是如你所说,那么我认为这是一个错误,应该报告。不过,对于动态添加的元素,树被破坏是显而易见的,我想这将得到修复。