-->
在概念章节大致介绍了依赖注入是什么,为什么 Angular 会选择依赖注入,本章节主要从基本使用开始进一步了解 Angular 中的依赖注入。
通过@angular/cli
提供的ng generate service heroes/hero
(简写ng g s heroes/hero
)命令可以快速的创建一个服务,创建后的服务代码如下:
// src/app/heroes/hero.service.ts
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class HeroService {
constructor() { }
}
HeroService 通过@Injectable()
装饰器标记为可以被注入的服务,providedIn: 'root'
表示当前服务在 Root 注入器中提供(简单理解就是这个服务在整个应用所有地方都可以注入)并全局唯一实例。
添加服务后,我们就可以在任何组件中通过构造函数注入 HeroService , 通过 TS 的构造函数赋值属性的特性设置为公开,这样组件内和模板中都可以使用该服务的函数和方法。
// src/app/heroes/hero-list.component
constructor(public heroService: HeroService)
简单的代码如下:
import { Hero } from '../hero';
import { HeroService } from '../hero.service';
@Component({
selector: 'app-hero-list',
template: 'Heroes: {{heroes | json}}'
})
export class HeroListComponent implements OnInit {
heroes!: Hero[];
constructor(public heroService: HeroService) {}
ngOnInit(): void {
this.heroes = this.heroService.getHeroes();
}
}
除了在组件中注入服务外,在 Angular 中还可以在服务中注入其他服务,当某个服务依赖于另一个服务时,遵循与注入组件相同的模式,比如:HeroService
要依靠Logger
服务来记录日志。
// src/app/heroes/hero.service.ts
import { Injectable } from '@angular/core';
import { HEROES } from './mock-heroes';
import { Logger } from '../logger.service';
@Injectable({
providedIn: 'root',
})
export class HeroService {
constructor(private logger: Logger) { }
getHeroes() {
this.logger.log('Getting heroes ...');
return HEROES;
}
}
以上就是在 Angular 中使用依赖注入最简单的的两步,通过面向对象的 API 共享数据和业务逻辑,是不是觉得特别简单和易读。
在熟悉了基本使用后,下面简单介绍一下 Angular 依赖注入的几个基本的元素:
@Inject()
装饰器,这是 Angular DI 提供的简写,注入一个服务的全写如下所示,定义服务通常都是使用类,所以省略@Inject(HeroService)
极大的简化了样板代码。
// src/app/heroes/hero-list.component
class HeroListComponent {
constructor(@Inject(HeroService) private heroService: HeroService) {}
}