理解angular2

时间:2016-04-01 08:24:13

标签: javascript dependency-injection typescript angular

以下是代码段

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

     constructor(private _myService : MyService){
     }

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

以下是我在angular2 / typescript中的理解/问题。

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

修改

  • 如果我在两个控制器处提供providers: [MyService]该怎么办?它会创建一个新实例还是从一个实例中获取?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

更新到您的“修改”

如果在不同位置添加相同的服务bootstrap(...)providers: [...],则每个提供商都会维护一个实例。

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

简短:是的,同一服务的两个提供商会产生两个不同的实例。