這篇文章主要為大家展示了“Angular4中ValueProvider怎么用”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Angular4中ValueProvider怎么用”這篇文章吧。
創(chuàng)新互聯(lián)公司是一家專業(yè)提供忻州企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站建設(shè)、H5開(kāi)發(fā)、小程序制作等業(yè)務(wù)。10年已為忻州眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。本系列教程的開(kāi)發(fā)環(huán)境及開(kāi)發(fā)語(yǔ)言:
Angular 4 +
Angular CLI
TypeScript
基礎(chǔ)知識(shí)
ValueProvider 的作用
ValueProvider 用于告訴 Injector (注入器),但使用 Token 獲取依賴對(duì)象時(shí),則返回 useValue 指定的值。
ValueProvider 的使用
const provider: ValueProvider = {provide: 'someToken', useValue: 'someValue'};
ValueProvider 接口
export interface ValueProvider { // 用于設(shè)置與依賴對(duì)象關(guān)聯(lián)的Token值,Token值可能是Type、InjectionToken、 // OpaqueToken的實(shí)例或字符串 provide: any; // 設(shè)置注入的對(duì)象 useValue: any; // 用于標(biāo)識(shí)是否multiple providers,若是multiple類型,則返回與Token關(guān)聯(lián)的依賴 // 對(duì)象列表 multi?: boolean; }
json-server 簡(jiǎn)介
json-server 用于基于 JSON 數(shù)據(jù)快速地創(chuàng)建本地模擬的 REST API。
json-server 的安裝
npm install -g json-server
json-server 的使用
json-server --watch db.json
Angular CLI 代理配置
創(chuàng)建 proxy.conf.json 文件
{ "/heros": { "target": "http://localhost:3000", "secure": false } }
更新 package.json 文件
{ "scripts": { "start": "ng serve --proxy-config proxy.conf.json", } }
ValueProvider
介紹完基礎(chǔ)知識(shí),我們馬上進(jìn)入正題。不知道大家是否還記得,在 "組件服務(wù)注入" 文章中提到的內(nèi)容:
難道一切就這么結(jié)束了,No! No!別忘記了我們這節(jié)課的主題是介紹如何在組件中注入服務(wù)。在目前的 HeroComponent 組件,我們的英雄列表信息是固定的,在實(shí)際的開(kāi)發(fā)場(chǎng)景中,一般需要從遠(yuǎn)程服務(wù)器獲取相應(yīng)的信息。
接下來(lái)我們將重構(gòu)我們的 HeroService 服務(wù),從 API 接口中獲取英雄數(shù)據(jù)。要使用 Angular 的 Http 服務(wù),首先需要在 AppModule 模塊中導(dǎo)入 HttpModule ,然后在 HeroService 類的構(gòu)造函數(shù)中注入 Http 服務(wù)。
更新 HeroService 服務(wù)
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> { this.loggerService.log('Fetching heros...'); return this.http.get(this.apiUrl) .map(res => res.json()) } }
在 HeroService 服務(wù)中,我們通過(guò)注入 Http 服務(wù)對(duì)象的get()
方法發(fā)送 HTTP 請(qǐng)求,從而從 API 接口中獲取英雄的數(shù)據(jù)。
更新 HeroComponent 組件
import { Component, OnInit } from '@angular/core'; import { HeroService } from '../hero.service'; import { LoggerService } from '../logger.service'; @Component({ selector: 'app-hero', template: `
更新完上述代碼,成功保存后,你會(huì)發(fā)現(xiàn) http://localhost:4200/ 頁(yè)面,一片空白。這就對(duì)了,因?yàn)槲覀冞€沒(méi)有啟動(dòng)本地的 json-server 服務(wù)器。接下來(lái)我們來(lái)配置并啟動(dòng)本地的 json-server 服務(wù)器:
創(chuàng)建 heros.json 文件
{ "heros": [ {"id":11,"name":"Mr. Nice"}, {"id":12,"name":"Narco"}, {"id":13,"name":"Bombasto"}, {"id":14,"name":"Celeritas"}, {"id":15,"name":"Magneta"} ] }
啟動(dòng) json-server 服務(wù)器
json-server --watch heros.json
當(dāng)成功啟動(dòng) json-server 服務(wù)器,在命令行中,你將看到以下輸出信息:
\{^_^}/ hi! Loading heros.json Done
這表示本地 json-server 已經(jīng)成功啟動(dòng),此時(shí)重新刷新以下 http://localhost:4200/ 頁(yè)面,你將看到以下信息:
ID: 11 - Name: Mr. Nice ID: 12 - Name: Narco ID: 13 - Name: Bombasto ID: 14 - Name: Celeritas ID: 15 - Name: Magneta
程序終于又正常運(yùn)行了,但注意到 HeroService 服務(wù)中,我們通過(guò)以下方式定義 API 接口地址:
@Injectable() export class HeroService { ... apiUrl = 'http://localhost:4200/heros'; }
這種方式有個(gè)問(wèn)題,假設(shè)其它服務(wù)也要使用該地址,那么就得按照同樣的方式去定義 API 接口地址。另外假設(shè) API 接口地址需要更新,那就需要修改多個(gè)地方。針對(duì)上述問(wèn)題,我們可以使用 ValueProvider 來(lái)解決問(wèn)題。
使用 ValueProvider
@NgModule({ ..., providers: [ { provide: 'apiUrl', useValue: 'http://localhost:4200/heros' } ], bootstrap: [AppComponent] }) export class AppModule { }
更新 HeroService 服務(wù)
@Injectable() export class HeroService { constructor(private loggerService: LoggerService, private http: Http, @Inject('apiUrl') private apiUrl) { } getHeros(): Observable> { this.loggerService.log('Fetching heros...'); return this.http.get(this.apiUrl) .map(res => res.json()) } }
在 HeroService 類的構(gòu)造函數(shù)中,我們通過(guò)@Inject('apiUrl')
方式,注入 apiUrl 該 Token 對(duì)應(yīng)的依賴對(duì)象,即 'http://localhost:4200/heros' 。為什么不能使用private apiUrl: 'apiUrl'
的方式,希望讀者好好回憶一下,之前我們介紹過(guò)的相關(guān)內(nèi)容。
以上代碼成功運(yùn)行后,在 http://localhost:4200/ 頁(yè)面,我們將看到預(yù)期的結(jié)果:
ID: 11 - Name: Mr. Nice ID: 12 - Name: Narco ID: 13 - Name: Bombasto ID: 14 - Name: Celeritas ID: 15 - Name: Magneta
我有話說(shuō)
為什么在構(gòu)造函數(shù)中,非 Type 類型的參數(shù)只能用@Inject(Something)
的方式注入 ?
因?yàn)?Type 類型的對(duì)象,會(huì)被 TypeScript 編譯器編譯。即我們通過(guò) class 關(guān)鍵字聲明的服務(wù),最終都會(huì)編譯成 ES5 的函數(shù)對(duì)象。
在構(gòu)造函數(shù)中,Type 類型的參數(shù)能用@Inject(Type)
的方式注入么?
Type 類型的參數(shù)也能使用@Inject(Type)
的方式注入,具體如下:
constructor(@Inject(Http) private http) { }
同樣也可以使用以下方式:
constructor(@Inject(Http) private http: Http) { }
第一種方式雖然可以正常編譯,但 IDE 會(huì)有如下的提示信息:
[ts] Parameter 'http' implicitly has an 'any' type.
第二種方式,雖然 Angular 內(nèi)部會(huì)合并design:paramtypes
與 parameters 內(nèi)的 metadata 信息,但本人覺(jué)得是有點(diǎn)冗余了。 總而言之,若果是 Type 類型的參數(shù),推薦使用下面的方式:
constructor(private http: Http) { }
以上是“Angular4中ValueProvider怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。