依赖注入DI:
可注入对象:服务(service)
提供依赖项
- 第一步:添加装饰器
装饰器@Injectable :此类可以被注入
import { Injectable } from '@angular/core';
@Injectable()
export class xxService{
constructor( ){ }
}
- 第二步: 提供依赖项
组件级别提供:
使用@Component的provider字段
@Component({
selector:'XX-list',
template:'...',
providers:[xxService]
})
class xxListComponent{}
在组件级别提供注册者,组件的每个新实例都会获得一个新的服务实例。
NgModule级别提供:
使用@NgModule的providers,xxService可以用于此NgModule中声明的所有组件、指令、管道
@NgModule({
declarations:[xxListComponent]
providers:[xxService]
})
class xxListModule{}
在应用程序根级别提供:
允许将其注入应用程序中的其他类。通过@Injectable的provideIn:‘root’
@Injectable({
providedIn:'root'
})
class xxCommonService {}
在根级别提供服务,大家会共享一个实例xxCommonService。
@Injectable元数据中的注册提供者(providedIn字段)允许Angular通过从已经编译的程序中山区没用到的服务来优化应用程序,这个过程称作tree-shaking(摇树优化)。
注入依赖项
- 在类的构造函数中声明:
- 其他方式
@Component({...})
class xxComponent{
constructor(private service :xxService){}
}
angular发现一个组件依赖于一个服务时,会先检查注入器中是否已经有该服务的实例。如果不存在,注入器就使用注册的提供者创建一个,在服务返回给Angular之前将他添加到注入器中。(官网文档)
请求的服务都解析返回时,angular才使用这些服务实例为参数调用该组件的构造函数。
在服务中注入服务:
形式上与一般注入没有什么区别,
import { Logger } form './logger.service';
@Injectable ({
providedIn:'root',
})
export class xxService {
constructor (private logger: Loger ){ }
...
}