gpt4 book ai didi

javascript - 了解angular2中的依赖注入(inject)

转载 作者:太空狗 更新时间:2023-10-29 17:57:57 26 4
gpt4 key购买 nike

这是一段代码

@Component({
... : ...
providers: [MyService]
})
export class MyComponent{

constructor(private _myService : MyService){
}

someFunction(){
this._myService.getSomething();
}
}

这是我的理解/问题它是如何在 angular2/typescript 中工作的。

  • 每当我们在 providers 中编写 MyService 时,都会创建一个单例对象。
  • 为什么要在构造函数中提供它?我们可以在其他地方做吗?
  • 无论谁调用构造函数(可能是 javascript 引擎),它如何知道将什么传递给参数
  • 或者我理解错了,这甚至都不是争论?

编辑

  • 如果我在两个 Controller 上提供 providers: [MyService] 会怎么样。它会创建一个新实例还是从一个实例中获取?

最佳答案

  • provider: [ ... ] 指定为每个提供者维护的单个实例的范围。范围是将类型添加到 providers: [ ... ] 及其后代的组件(只要它们不使用具有相同键的另一个提供者覆盖它)。在 bootstrap(AppComponent, [SomeProvider]) 中列出一个提供者使其全局可用,同样只要不被组件上的提供者隐藏。

  • Angular2 仅支持构造函数注入(inject)。还有其他策略,但它们被认为是有问题的。

  • Angular 分析构造器参数以了解在创建实例时需要传入哪些参数,从其提供者或父提供者获取适当的实例并将它们传递进来。
    为此,如果类不是组件、指令或管道,则需要使用 @Injectable() 对其进行修饰。

  • DI(依赖注入(inject))仅将实例传递给它自己创建的实例的构造函数参数。对于它创建的每个实例,它检查构造函数参数并从自身(提供者)获取匹配的实例并将它们传递进来。如果这些依赖项中的一个本身再次需要构造函数参数,则递归地进行直到所有依赖项都被解析。
    Jasmine 不会将实例传递给构造函数本身,它必须将实例委托(delegate)给 DI。

更新您的“编辑”

如果在不同的地方添加相同的服务 bootstrap(...)providers: [...] 然后每个提供者维护一个实例。

当一个类请求依赖项(通过构造函数参数)时,DI 向上查找 bootstrap() 并返回它找到的第一个提供者的实例。 (这就是为什么组件上的提供者隐藏了祖先组件或 bootstrap(...)

的提供者

简而言之:是的,同一服务的两个提供者会产生两个不同的实例。

关于javascript - 了解angular2中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36351484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com