Angular 2依赖注入 - 如何知道插入依赖项的位置

时间:2017-02-23 19:22:29

标签: javascript angular

我正在学习angular2并且发现自己有时会在哪里注入依赖关系。例如,在使用RouteParams

import {RouteParams} from 'angular2/router';

我们只是将它传递给构造函数方法,我们很高兴:

constructor(private _photoService: PhotoService, private _routeParams: RouteParams){
    }

但是,当我们使用同一模块ROUTER_DIRECTIVES

中的'angular2/router'
import {ROUTER_DIRECTIVES} from 'angular2/router';

我们需要将它传递给组件的指令数组:

directives: [ROUTER_DIRECTIVES]

所以,我的问题是,我怎么知道,我需要传递它的位置,何时将依赖项传递给指令或提供者数组,或者只是传递给构造函数方法?

2 个答案:

答案 0 :(得分:0)

依赖关系是根据他们的行为来定义的。

有一种疯狂的方法,但是当你开始确定时,它是压倒性的。请查看https://angular.io/docs/ts/latest/guide/architecture.html

上的文档

基本上指令操纵DOM,依赖注入注入一个完整的类(包含所有依赖项)等等。所以有特定的方法/地方告诉Angular什么是什么。

希望这些文档可以帮助您解决问题。它大约在页面的一半处开始讨论指令和注入。

答案 1 :(得分:0)

DI使用提供程序来创建和保存值。

如果您注册了提供商@NgModule({providers: []})@Component({providers: []})@Directive({providers: []}),则会定义将哪些值传递给依赖于它们的构造函数。

如果您在非延迟加载的@NgModule() DI中注册提供程序,则会在其根范围内为整个应用程序提供单个实例。

如果在@Component()或`@Directive()上注册提供者,则DI将为每个组件或指令实例提供单个实例。

如果MyComponent提供服务A并且您的网页上有5个MyComponent个实例,则最多会有5个A个实例(提供商仅创建第一次请求时的实例。

当组件,指令或管道具有构造函数参数时,DI将尝试查找与参数类型匹配的提供程序或@Inject()装饰器(如果有)。 DI开始查看提供程序的主机组件,并将其保存的实例传递给构造函数。如果主机组件没有提供匹配的提供者,则DI会一直查看父组件,直到找到父组件。如果它到达根组件(AppComponent)但仍未找到提供者,则会检查根范围(@NgModule()提供者)。

延迟加载模块有点特殊,因为在那里注册的提供程序无法添加到根范围。一旦创建了范围(注入器),就无法注册新的提供者。

延迟加载的模块为应用程序根范围创建子范围。 在那里注册的提供者只能看到组件,指令,管道和服务,它们是延迟加载模块的一部分(以及加载了延迟加载模块的导入模块)。