Javascript Angular2如何管理依赖注入?
我知道要将依赖性注入Angular2组件,我只需在其构造函数中注释一个参数,就像这里的Javascript Angular2如何管理依赖注入?,javascript,angular,typescript,Javascript,Angular,Typescript,我知道要将依赖性注入Angular2组件,我只需在其构造函数中注释一个参数,就像这里的ThingService一样。我想了解的是Angular如何知道在运行时注入什么,就我所知,这只是TypeScript注释,在运行时没有任何意义。这种机制的底层内部机制是什么,用于管理组件构造函数中放置了哪些提供程序。如果你自己使用这个系统,它将如何工作。这是我不理解的打字脚本机制吗 @Component({ selector: 'app-thing', templateUrl: './thing.co
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
@Injectable()
decorator,否则它们的依赖项的元数据将不会被释放)我已经写了一篇关于这个话题的深入文章你提到过这个吗?这对我来说并不是很清楚。我知道我将如何使用它,我知道它做什么,但我对它的理解不够清楚,无法自己实现它。我正在寻找一种机制,通过该机制,Angular可以确定哪些提供者将以何种顺序放置在组件中constructor@MildFuzz您的意思是,如果您向构造函数添加另一个服务,它将首先调用哪个服务?就像一个循环依赖性问题?如果我有另一个服务,我注入它,Angular怎么知道
ThingService
应该是构造函数中的第一个参数,而不是第二个参数?@MildFuzz它的顺序与您在构造函数中定义的顺序相同。我感觉到你有一个依赖循环啊,但是如何呢?据我所知,类型注释在运行时没有意义。如何定义一个类,并动态地知道它需要什么依赖关系?这似乎正在发生。