我正在学习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]
所以,我的问题是,我怎么知道,我需要传递它的位置,何时将依赖项传递给指令或提供者数组,或者只是传递给构造函数方法?
答案 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()
提供者)。
延迟加载模块有点特殊,因为在那里注册的提供程序无法添加到根范围。一旦创建了范围(注入器),就无法注册新的提供者。
延迟加载的模块为应用程序根范围创建子范围。 在那里注册的提供者只能看到组件,指令,管道和服务,它们是延迟加载模块的一部分(以及加载了延迟加载模块的导入模块)。