我需要使用提供者:[]
为了使依赖注入能够为您创建实例,您需要在某处为这些类(或其他值)注册提供者。
您注册提供者的位置决定了创建值的范围。Angulars DI 是分层的。
如果您在树的根部注册提供程序
>=RC.5
@NgModule({
providers: [/*providers*/]
...
})
或者对于延迟加载的模块
static forRoot(config: UserServiceConfig): ModuleWithProviders {
return {
ngModule: CoreModule,
providers: [
{provide: UserServiceConfig, useValue: config }
]
};
}
<=RC.4
(bootstrap(AppComponent, [Providers})
或@Component(selector: 'app-component', providers: [Providers])
(根组件)
那么所有请求实例的组件和服务都会获得相同的实例。
如果提供者在其中一个子组件中注册,则为该组件的后代提供一个新的(不同的)实例。
如果组件请求一个实例(通过构造函数参数),DI 会“向上”查找组件树(从叶子开始到根)并获取它找到的第一个提供程序。如果之前已经创建了此提供程序的实例,则使用此实例,否则将创建一个新实例。
@注入()
当组件或服务向 DI 请求一个值时,例如
constructor(someField:SomeType) {}
DI 按类型查找提供程序SomeType
。如果@Inject(SomeType)
添加
constructor(@Inject(SomeType) someField:SomeType) {}
DI 通过传递给的参数查找提供程序@Inject()
。在上面的示例中,传递给的参数与@Inject()
参数的类型相同,因此@Inject(SomeType)
是多余的。
但是,在某些情况下,您希望自定义行为,例如注入配置设置。
constructor(@Inject('someName') someField:string) {}
当您注册了多个时,该类型string
不足以区分特定的配置设置。
配置值需要在某处注册为提供者
>=RC.5
@NgModule({
providers: [{provide: 'someName', useValue: 'abcdefg'})]
...
})
export class AppModule {}
<=RC.4
bootstrap(AppComponent, [provide('someName', {useValue: 'abcdefg'})])
@Inject()
因此,FormBuilder
如果构造函数看起来像,则不需要
constructor(formBuilder: FormBuilder) {}