我一直在试图弄清楚Angular2中的(DI)依赖注入(inject)是如何工作的。每次尝试将服务/或类注入(inject)组件时,都会遇到很多问题/问题。

从不同的Google文章中,我需要在Component配置中使用providers: [],或者有时需要在构造函数中使用@Inject()或直接在bootstrap(app, [service])中注入(inject)?我也看到一些文章希望我放置@injectable装饰器。

例如:注入(inject)Http,我只需要import{Http}并将Http放在提供程序中,但是对于FormBuilder,我需要在构造函数中使用@Inject()

何时使用什么有什么经验法则吗?您能否提供一些示例代码片段?谢谢 :-)

最佳答案

Angular2中的依赖注入(inject)依赖于链接到组件树的分层注入(inject)器。

这意味着您可以在不同级别上配置提供程序:

  • 用于引导时的整个应用程序。在这种情况下,所有子注入(inject)器(组成部分的注入(inject)器)都将看到此提供程序并共享与之关联的实例。进行交互时,它将是同一实例
  • 用于特定组件及其子组件。与以前相同,但用于à特定组件。其他组件将看不到该提供程序。如果重新定义上面定义的内容(例如,在进行引导时),则将使用此提供程序。因此,您可以覆盖所有内容。
  • 用于服务。没有与他们关联的提供者。他们使用触发元素的注入(inject)器中的一个(直接=组件或间接=触发服务链调用的组件)

  • 关于您的其他问题:
  • @可注入(inject)。要插入一个类,您需要一个装饰器。组件只有一个(@Component是一个),但是服务是简单的类。如果服务要求将依赖项注入(inject)其中,则需要此装饰器。
  • @注入(inject)。在大多数情况下,构造函数参数的类型足以让Angular2确定要注入(inject)的内容。在某些情况下(例如,如果您显式使用OpaqueToken而不是类来注册提供程序),则需要指定一些有关注入(inject)内容的提示。在这种情况下,您需要使用@Inject。

  • 有关其他详细信息,请参见以下问题:
  • What's the best way to inject one service into another in angular 2 (Beta)?
  • Angular2: Inject a non @Injectable class
  • Inject all Services that implement some Interface
  • 10-06 07:27
    查看更多