亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Angular4中ValueProvider怎么用

發布時間:2021-08-09 14:07:54 來源:億速云 閱讀:111 作者:小新 欄目:web開發

這篇文章主要為大家展示了“Angular4中ValueProvider怎么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Angular4中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?: boolean;
}

json-server 簡介

json-server 用于基于 JSON 數據快速地創建本地模擬的 REST API。

json-server 的安裝

npm install -g json-server

json-server 的使用

json-server --watch db.json

Angular 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) { }

以上是“Angular4中ValueProvider怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东光县| 临洮县| 巴青县| 莎车县| 贵阳市| 江达县| 宿迁市| 桐梓县| 丰县| 黔西县| 靖宇县| 昭觉县| 赤峰市| 广元市| 乡城县| 和林格尔县| 乌拉特中旗| 平塘县| 洪雅县| 饶平县| 璧山县| 建始县| 湛江市| 宿松县| 唐山市| 广平县| 永善县| 防城港市| 从化市| 中阳县| 伊吾县| 安乡县| 南通市| 麻栗坡县| 宾阳县| 壶关县| 罗江县| 吕梁市| 揭西县| 大荔县| 镇宁|