2017-02-23 240 views
0

我正在学习angular2,并发现自己有时会有点混淆注入依赖关系。喜欢用RouteParamsAngular 2依赖注入 - 如何知道在哪里插入依赖关系

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

如果它们是指令,它是'声明'(不是'指令'!)。如果他们是提供者,那就是“提供者”。如果你将一个未在'providers'中定义的提供者传递给构造函数,它将会抛出一个错误。它是如此简单。您使用的是一些真正弃用的示例(alpha或beta)的代码。我会建议RTM,而不是老的教程。相当长时间内,无论是指令还是提供者都不需要明确从路由器模块导入。 – estus

+0

'ROUTER_DIRECTIVES'已经过时了。你使用的是什么Angular版本?它应该是'RouterModule'并进入'进口:''@NgModule()'' –

回答

0

依赖关系是根据他们所做的事情来定义的。

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

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

希望这些文档有助于为您解决问题。大约一半的时间开始讨论指令和注射。

0

DI使用提供者创建并保存一个值。

如果您注册提供商@NgModule({providers: []})@Component({providers: []})@Directive({providers: []})定义了什么值或实例将传递给依赖于它们的构造函数。

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

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

如果MyComponent提供服务A和有您的网页上的MyComponent 5个实例,则会有高达A 5个实例(供应商只创建当请求第一次一个实例)。

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

延迟加载的模块有点特殊,因为注册的提供者不能添加到根作用域。一旦范围(喷射器)被创建,新的提供者就不能被注册。

延迟加载的模块为应用程序根作用域创建子作用域。 在那里注册的提供者只对组件,指令,管道和服务是可见的,这些组件是延迟加载模块的一部分(以及加载了延迟加载模块的导入模块)。