Angular 4 依赖注入教程之六 Injectable装饰器
目录
阅读须知本系列教程的开发环境及开发语言:
基础知识装饰器是什么
装饰器的分类
TypeScript 类装饰器类装饰器声明: declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void 类装饰器顾名思义,就是用来装饰类的。它接收一个参数:
看完第一眼后,是不是感觉都不好了。没事,我们马上来个例子: function Greeter(target: Function): void { target.prototype.greet = function (): void { console.log('Hello!'); } } @Greeter class Greeting { constructor() { // 内部实现 } } let myGreeting = new Greeting(); myGreeting.greet(); // console output: 'Hello!'; 上面的例子中,我们定义了 Injectable 类装饰器使用import { Injectable } from '@angular/core'; @Injectable() class HeroService {} Injectable 装饰器在介绍 @Component({ selector: 'app-hero',template: ` <ul> <li *ngFor="let hero of heros"> ID: {{hero.id}} - Name: {{hero.name}} </li> </ul> ` }) export class HeroComponent implements OnInit { heros: Array<{ id: number; name: string }>; constructor(private heroService: HeroService,private loggerService: LoggerService) { } ngOnInit() { this.loggerService.log('Fetching heros...'); this.heros = this.heroService.getHeros(); } } 在 更新前 HeroService 服务export class HeroService { heros: Array<{ id: number; name: string }> = [ { id: 11,name: 'Mr. Nice' },{ id: 12,name: 'Narco' },{ id: 13,name: 'Bombasto' },{ id: 14,name: 'Celeritas' },{ id: 15,name: 'Magneta' },{ id: 16,name: 'RubberMan' },{ id: 17,name: 'Dynama' },{ id: 18,name: 'Dr IQ' },{ id: 19,name: 'Magma' },{ id: 20,name: 'Tornado' } ]; getHeros() { return this.heros; } } 更新后 HeroService 服务import { LoggerService } from './logger.service'; export class HeroService { constructor(private loggerService: LoggerService) { } heros: Array<{ id: number; name: string }> = [ { id: 11,name: 'Magneta' } ]; getHeros() { this.loggerService.log('Fetching heros...'); return this.heros; } } 当以上代码运行后会抛出以下异常信息: Uncaught Error: Can't resolve all parameters for HeroService: (?). 上面异常信息说明无法解析 export class HeroService { constructor(private loggerService: LoggerService) { } } 该构造函数的输入参数是 var HeroService = (function() { function HeroService(loggerService) { this.loggerService = loggerService; this.heros = [{...},...]; } HeroService.prototype.getHeros = function() { this.loggerService.log('Fetching heros...'); return this.heros; }; return HeroService; }()); 我们发现生成的 import { Injectable } from '@angular/core'; import { LoggerService } from './logger.service'; @Injectable() export class HeroService { // ... } 更新完上面的代码,成功保存后,在 ID: 11 - Name: Mr. Nice ID: 12 - Name: Narco ID: 13 - Name: Bombasto ID: 14 - Name: Celeritas ID: 15 - Name: Magneta 现在我们再来看一下 var HeroService = (function() { function HeroService(loggerService) { this.loggerService = loggerService; this.heros = [{...},...]; } HeroService.prototype.getHeros = function() { this.loggerService.log('Fetching heros...'); return this.heros; }; return HeroService; }()); HeroService = __decorate([__webpack_require__.i( __WEBPACK_IMPORTED_MODULE_0__angular_core__["c"/* Injectable */ ])(),__metadata("design:paramtypes",...)],HeroService); __decorate 函数var __decorate = (this && this.__decorate) || function(decorators,target,key,desc) {...}; __metadata 函数var __metadata = (this && this.__metadata) || function(k,v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k,v); }; 我们发现相比未使用 我有话说@Injectable() 是必须的么?如果所创建的服务不依赖于其他对象,是可以不用使用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |