学习目录
- Angular 4 依赖注入教程之一 依赖注入简介
- Angular 4 依赖注入教程之二 组件服务注入
- Angular 4 依赖注入教程之三 ClassProvider的使用
- Angular 4 依赖注入教程之四 FactoryProvider的使用
- Angular 4 依赖注入教程之五 FactoryProvider配置依赖对象
- Angular 4 依赖注入教程之六 Injectable 装饰器
- Angular 4 依赖注入教程之七 ValueProvider的使用
- Angular 4 依赖注入教程之八 InjectToken的使用
前言
本文主要给大家介绍了关于Angular 4依赖注入之ValueProvider使用的相关内容,分享出来供大家参考学习,下面来一起详细的介绍:
本系列教程的开发环境及开发语言:
- Angular 4 +
- Angular CLI
- TypeScript
基础知识
ValueProvider 的作用
ValueProvider 用于告诉 Injector (注入器),但使用 Token 获取依赖对象时,则返回 useValue 指定的值。
ValueProvider 的使用
const provider: ValueProvider = {provide: 'someToken', useValue: 'someValue'};
ValueProvider 接口
export interface ValueProvider { // 用于设置与依赖对象关联的Token值,Token值可能是Type、InjectionToken、 // OpaqueToken的实例或字符串 provide: any; // 设置注入的对象 useValue: any; // 用于标识是否multiple providers,若是multiple类型,则返回与Token关联的依赖 // 对象列表 multi"external nofollow" target="_blank" href="https://github.com/typicode/json-server">json-server 用于基于 JSON 数据快速地创建本地模拟的 REST API。json-server 的安装
npm install -g json-serverjson-server 的使用
json-server --watch db.jsonAngular CLI 代理配置
创建 proxy.conf.json 文件
{ "/heros": { "target": "http://localhost:3000", "secure": false } }更新 package.json 文件
{ "scripts": { "start": "ng serve --proxy-config proxy.conf.json", } }ValueProvider
介绍完基础知识,我们马上进入正题。不知道大家是否还记得,在 "组件服务注入" 文章中提到的内容:
难道一切就这么结束了,No! No!别忘记了我们这节课的主题是介绍如何在组件中注入服务。在目前的 HeroComponent 组件,我们的英雄列表信息是固定的,在实际的开发场景中,一般需要从远程服务器获取相应的信息。
接下来我们将重构我们的 HeroService 服务,从 API 接口中获取英雄数据。要使用 Angular 的 Http 服务,首先需要在 AppModule 模块中导入 HttpModule ,然后在 HeroService 类的构造函数中注入 Http 服务。
更新 HeroService 服务
import { Injectable } from '@angular/core'; import { Http } from '@angular/http'; import { Observable } from 'rxjs/Observable'; import 'rxjs/add/operator/map'; import { LoggerService } from './logger.service'; @Injectable() export class HeroService { constructor(private loggerService: LoggerService, private http: Http) { } apiUrl = 'http://localhost:4200/heros'; getHeros(): Observable<Array<{ id: number; name: string } { this.loggerService.log('Fetching heros...'); return this.http.get(this.apiUrl) .map(res => res.json()) } }在 HeroService 服务中,我们通过注入 Http 服务对象的
get()
方法发送 HTTP 请求,从而从 API 接口中获取英雄的数据。更新 HeroComponent 组件
import { Component, OnInit } from '@angular/core'; import { HeroService } from '../hero.service'; import { LoggerService } from '../logger.service'; @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.heroService.getHeros() .subscribe(res => { this.heros = res; }); } }更新完上述代码,成功保存后,你会发现 http://localhost:4200/ 页面,一片空白。这就对了,因为我们还没有启动本地的 json-server 服务器。接下来我们来配置并启动本地的 json-server 服务器:
创建 heros.json 文件
{ "heros": [ {"id":11,"name":"Mr. Nice"}, {"id":12,"name":"Narco"}, {"id":13,"name":"Bombasto"}, {"id":14,"name":"Celeritas"}, {"id":15,"name":"Magneta"} ] }启动 json-server 服务器
json-server --watch heros.json当成功启动 json-server 服务器,在命令行中,你将看到以下输出信息:
\{^_^}/ hi! Loading heros.json Done这表示本地 json-server 已经成功启动,此时重新刷新以下 http://localhost:4200/ 页面,你将看到以下信息:
ID: 11 - Name: Mr. Nice ID: 12 - Name: Narco ID: 13 - Name: Bombasto ID: 14 - Name: Celeritas ID: 15 - Name: Magneta程序终于又正常运行了,但注意到 HeroService 服务中,我们通过以下方式定义 API 接口地址:
@Injectable() export class HeroService { ... apiUrl = 'http://localhost:4200/heros'; }这种方式有个问题,假设其它服务也要使用该地址,那么就得按照同样的方式去定义 API 接口地址。另外假设 API 接口地址需要更新,那就需要修改多个地方。针对上述问题,我们可以使用 ValueProvider 来解决问题。
使用 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()) } }在 HeroService 类的构造函数中,我们通过
@Inject('apiUrl')
方式,注入 apiUrl 该 Token 对应的依赖对象,即 'http://localhost:4200/heros' 。为什么不能使用private apiUrl: 'apiUrl'
的方式,希望读者好好回忆一下,之前我们介绍过的相关内容。以上代码成功运行后,在 http://localhost:4200/ 页面,我们将看到预期的结果:
ID: 11 - Name: Mr. Nice ID: 12 - Name: Narco ID: 13 - Name: Bombasto ID: 14 - Name: Celeritas ID: 15 - Name: Magneta我有话说
为什么在构造函数中,非 Type 类型的参数只能用
@Inject(Something)
的方式注入 ?
因为 Type 类型的对象,会被 TypeScript 编译器编译。即我们通过 class 关键字声明的服务,最终都会编译成 ES5 的函数对象。在构造函数中,Type 类型的参数能用
@Inject(Type)
的方式注入么?
Type 类型的参数也能使用
@Inject(Type)
的方式注入,具体如下:constructor(@Inject(Http) private http) { }同样也可以使用以下方式:
constructor(@Inject(Http) private http: Http) { }第一种方式虽然可以正常编译,但 IDE 会有如下的提示信息:
[ts] Parameter 'http' implicitly has an 'any' type.第二种方式,虽然 Angular 内部会合并
design:paramtypes
与 parameters 内的 metadata 信息,但本人觉得是有点冗余了。 总而言之,若果是 Type 类型的参数,推荐使用下面的方式:constructor(private http: Http) { }总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用Angular 4能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】