Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angular2如何管理依赖注入?_Javascript_Angular_Typescript - Fatal编程技术网

Javascript Angular2如何管理依赖注入?

Javascript Angular2如何管理依赖注入?,javascript,angular,typescript,Javascript,Angular,Typescript,我知道要将依赖性注入Angular2组件,我只需在其构造函数中注释一个参数,就像这里的ThingService一样。我想了解的是Angular如何知道在运行时注入什么,就我所知,这只是TypeScript注释,在运行时没有任何意义。这种机制的底层内部机制是什么,用于管理组件构造函数中放置了哪些提供程序。如果你自己使用这个系统,它将如何工作。这是我不理解的打字脚本机制吗 @Component({ selector: 'app-thing', templateUrl: './thing.co

我知道要将依赖性注入Angular2组件,我只需在其构造函数中注释一个参数,就像这里的
ThingService
一样。我想了解的是Angular如何知道在运行时注入什么,就我所知,这只是TypeScript注释,在运行时没有任何意义。这种机制的底层内部机制是什么,用于管理组件构造函数中放置了哪些提供程序。如果你自己使用这个系统,它将如何工作。这是我不理解的打字脚本机制吗

@Component({
  selector: 'app-thing',
  templateUrl: './thing.component.html',
  styleUrls: ['./thing.component.scss']
})
export class ThingComponent {

  constructor(
    private thingService: ThingService) {
  }
}

如果我理解正确的话,你是在要求一个更具理论性的(ts背后的js)答案

根据我所读到的;angular2注入系统创建该提供程序对象/函数的一个实例,并在该组件中使用该实例,就像在构造函数中定义该实例一样。如果您尚未在正在使用的组件中提供它,那么它将转到它的父组件,直到使用它的模块。每个级别都有自己的提供者实例映射,组件将使用它向上遍历注入树时找到的第一个实例


因此,在定义提供程序之前,它将是一个单实例。

实际情况是,TypeScript在生成的ES5代码中保留元数据。因此,构造函数中的注释实际上并没有消失,它在运行时可用,然后Angular的DI可以从那里获取它

如果满足以下要求,则TypeScript始终保留该元数据:

  • 编译器选项属性-
    emitDecoratorMetadata
    experimentalDecorators
    -都需要设置为
    true
  • 类上必须至少有一个decorator(这就是为什么有些服务类使用
    @Injectable()
    decorator,否则它们的依赖项的元数据将不会被释放)

  • 我已经写了一篇关于这个话题的深入文章

    你提到过这个吗?这对我来说并不是很清楚。我知道我将如何使用它,我知道它做什么,但我对它的理解不够清楚,无法自己实现它。我正在寻找一种机制,通过该机制,Angular可以确定哪些提供者将以何种顺序放置在组件中constructor@MildFuzz您的意思是,如果您向构造函数添加另一个服务,它将首先调用哪个服务?就像一个循环依赖性问题?如果我有另一个服务,我注入它,Angular怎么知道
    ThingService
    应该是构造函数中的第一个参数,而不是第二个参数?@MildFuzz它的顺序与您在构造函数中定义的顺序相同。我感觉到你有一个依赖循环啊,但是如何呢?据我所知,类型注释在运行时没有意义。如何定义一个类,并动态地知道它需要什么依赖关系?这似乎正在发生。