Angular 4 依赖注入教程之八 InjectToken的使用
目录
阅读须知本系列教程的开发环境及开发语言:
基础知识OpaqueToken 简介
OpaqueToken 类的定义export class OpaqueToken { constructor(protected _desc: string) {} toString(): string { return `Token ${this._desc}`; } } OpaqueToken 类的使用import { ReflectiveInjector } from '@angular/core'; var t = new OpaqueToken("value"); var injector = ReflectiveInjector.resolveAndCreate([ {provide: t,useValue: "bindingValue"} ]); injector.get(t); // "bindingValue" InjectionToken 简介
InjectionToken 类的定义export class InjectionToken<T> extends OpaqueToken { private _differentiate_from_OpaqueToken_structurally: any; constructor(desc: string) { super(desc); } toString(): string { return `InjectionToken ${this._desc}`; } } InjectionToken 类的使用import { ReflectiveInjector } from '@angular/core'; var t = new InjectionToken<string>("value"); var injector = ReflectiveInjector.resolveAndCreate([ {provide: t,useValue: "bindingValue"} ]); injector.get(t); // "bindingValue" InjectionToken在介绍 使用 ValueProvider@NgModule({ ...,providers: [ { provide: 'apiUrl',useValue: 'http://localhost:4200/heros' } ],bootstrap: [AppComponent] }) export class AppModule { } 更新 HeroService 服务@Injectable() export class HeroService { constructor(private loggerService: LoggerService,private http: Http,@Inject('apiUrl') private apiUrl) { } getHeros(): Observable<Array<{ id: number; name: string }>> { this.loggerService.log('Fetching heros...'); return this.http.get(this.apiUrl) .map(res => res.json()) } } 为了能够更方便地管理与维护 export const THIRD_PARTY_PROVIDERS = [ { provide: 'apiUrl',useValue: 'Other Url' } ]; 接着我们在 import { THIRD_PARTY_PROVIDERS } from './third-party'; @NgModule({ ...,useValue: 'http://localhost:4200/heros' },THIRD_PARTY_PROVIDERS ],bootstrap: [AppComponent] }) export class AppModule { } 当更新完上述代码,成功保存后,你会发现 GET http://localhost:4200/Other%20value 404 (Not Found) 什么情况,我们的英雄信息的接口地址被替换了,其实真正的原因是使用字符串作为 相信很多读者已经习惯了我的 "套路",当然要让我们的主角 - import { InjectionToken } from '@angular/core'; export const API_URL = new InjectionToken<string>('apiUrl'); 接下来我们在更新一下 import { API_URL } from './app.tokens'; @NgModule({ ...,providers: [ { provide: API_URL,bootstrap: [AppComponent] }) export class AppModule { } 然后在更新 import { API_URL } from './app.tokens'; @Injectable() export class HeroService { constructor(private loggerService: LoggerService,@Inject(API_URL) private apiUrl) { } } 当更新完上述代码,成功保存后,你会发现 import { InjectionToken } from '@angular/core'; const API_URL = new InjectionToken<string>('apiUrl'); export const THIRD_PARTY_PROVIDERS = [ { provide: API_URL,useValue: 'Other value' } ]; 你会发现更新完
我有话说OpaqueToken 与 InjectionToken 有什么区别?相同点
不同点
AngularJS 1.x DI 系统存在的问题
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |