欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Angular 4依賴注入學(xué)習(xí)教程之ValueProvider的使用(七)

 更新時間:2017年06月04日 10:41:33   作者:semlinker  
這篇文章主要給大家介紹了關(guān)于Angular 4依賴注入之ValueProvider使用的相關(guān)資料,文中介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Angular4具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。

學(xué)習(xí)目錄

前言

本文主要給大家介紹了關(guān)于Angular 4依賴注入之ValueProvider使用的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面來一起詳細(xì)的介紹:

本系列教程的開發(fā)環(huán)境及開發(fā)語言:

基礎(chǔ)知識

ValueProvider 的作用

ValueProvider 用于告訴 Injector (注入器),但使用 Token 獲取依賴對象時,則返回 useValue 指定的值。

ValueProvider 的使用

const provider: ValueProvider = {provide: 'someToken', useValue: 'someValue'};

ValueProvider 接口

export interface ValueProvider {
 // 用于設(shè)置與依賴對象關(guān)聯(lián)的Token值,Token值可能是Type、InjectionToken、
 // OpaqueToken的實(shí)例或字符串
 provide: any;
 // 設(shè)置注入的對象
 useValue: any;
 // 用于標(biāo)識是否multiple providers,若是multiple類型,則返回與Token關(guān)聯(lián)的依賴
 // 對象列表
 multi?: boolean;
}

json-server 簡介

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ǔ)知識,我們馬上進(jìn)入正題。不知道大家是否還記得,在 "組件服務(wù)注入" 文章中提到的內(nèi)容:

難道一切就這么結(jié)束了,No! No!別忘記了我們這節(jié)課的主題是介紹如何在組件中注入服務(wù)。在目前的 HeroComponent 組件,我們的英雄列表信息是固定的,在實(shí)際的開發(fā)場景中,一般需要從遠(yuǎn)程服務(wù)器獲取相應(yīng)的信息。

接下來我們將重構(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<Array<{ id: number; name: string }>> {
 this.loggerService.log('Fetching heros...');
 return this.http.get(this.apiUrl)
  .map(res => res.json())
 }
}

在 HeroService 服務(wù)中,我們通過注入 Http 服務(wù)對象的 get() 方法發(fā)送 HTTP 請求,從而從 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: `
 <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;
 });
 }
}

更新完上述代碼,成功保存后,你會發(fā)現(xiàn) http://localhost:4200/ 頁面,一片空白。這就對了,因?yàn)槲覀冞€沒有啟動本地的 json-server 服務(wù)器。接下來我們來配置并啟動本地的 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"}
 ]
}

啟動 json-server 服務(wù)器

json-server --watch heros.json

當(dāng)成功啟動 json-server 服務(wù)器,在命令行中,你將看到以下輸出信息:

\{^_^}/ hi!

Loading heros.json
Done

這表示本地 json-server 已經(jīng)成功啟動,此時重新刷新以下 http://localhost:4200/ 頁面,你將看到以下信息:

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ù)中,我們通過以下方式定義 API 接口地址:

@Injectable()
export class HeroService {
 ...
 apiUrl = 'http://localhost:4200/heros';
}

這種方式有個問題,假設(shè)其它服務(wù)也要使用該地址,那么就得按照同樣的方式去定義 API 接口地址。另外假設(shè) API 接口地址需要更新,那就需要修改多個地方。針對上述問題,我們可以使用 ValueProvider 來解決問題。

使用 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<Array<{ id: number; name: string }>> {
 this.loggerService.log('Fetching heros...');
 return this.http.get(this.apiUrl)
  .map(res => res.json())
 }
}

在 HeroService 類的構(gòu)造函數(shù)中,我們通過 @Inject('apiUrl') 方式,注入 apiUrl 該 Token 對應(yīng)的依賴對象,即 'http://localhost:4200/heros' 。為什么不能使用 private apiUrl: 'apiUrl' 的方式,希望讀者好好回憶一下,之前我們介紹過的相關(guān)內(nèi)容。

以上代碼成功運(yùn)行后,在 http://localhost:4200/ 頁面,我們將看到預(yù)期的結(jié)果:

ID: 11 - Name: Mr. Nice
ID: 12 - Name: Narco
ID: 13 - Name: Bombasto
ID: 14 - Name: Celeritas
ID: 15 - Name: Magneta

我有話說

為什么在構(gòu)造函數(shù)中,非 Type 類型的參數(shù)只能用 @Inject(Something) 的方式注入 ?
因?yàn)?Type 類型的對象,會被 TypeScript 編譯器編譯。即我們通過 class 關(guān)鍵字聲明的服務(wù),最終都會編譯成 ES5 的函數(shù)對象。

在構(gòu)造函數(shù)中,Type 類型的參數(shù)能用 @Inject(Type) 的方式注入么?

Type 類型的參數(shù)也能使用 @Inject(Type) 的方式注入,具體如下:

constructor(@Inject(Http) private http) { }

同樣也可以使用以下方式:

constructor(@Inject(Http) private http: Http) { }

第一種方式雖然可以正常編譯,但 IDE 會有如下的提示信息:

[ts] Parameter 'http' implicitly has an 'any' type.

第二種方式,雖然 Angular 內(nèi)部會合并 design:paramtypes 與 parameters 內(nèi)的 metadata 信息,但本人覺得是有點(diǎn)冗余了。 總而言之,若果是 Type 類型的參數(shù),推薦使用下面的方式:

constructor(private http: Http) { }

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者使用Angular 4能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 詳解Angular數(shù)據(jù)綁定及其實(shí)現(xiàn)方式

    詳解Angular數(shù)據(jù)綁定及其實(shí)現(xiàn)方式

    數(shù)據(jù)綁定是將應(yīng)用程序UI或用戶界面綁定到模型的機(jī)制。使用數(shù)據(jù)綁定,用戶將能夠使用瀏覽器來操縱網(wǎng)站上存在的元素。
    2021-05-05
  • Angular的FormArray和模態(tài)框結(jié)合使用實(shí)例詳解

    Angular的FormArray和模態(tài)框結(jié)合使用實(shí)例詳解

    這篇文章主要為大家介紹了Angular的FormArray和模態(tài)框結(jié)合使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Angular 7工作方式事件綁定

    Angular 7工作方式事件綁定

    在本章中將討論事件綁定在Angular7中的工作方式,當(dāng)用戶以鍵盤移動,鼠標(biāo)單擊或鼠標(biāo)懸停的形式與應(yīng)用程序交互時,它將生成一個事件,需要處理這些事件以執(zhí)行某種操作,考慮一個示例以更好地理解這一點(diǎn)
    2023-12-12
  • AngularJS改變元素顯示狀態(tài)

    AngularJS改變元素顯示狀態(tài)

    本文主要介紹使用AngularJS提供的ng-show和ng-hide指令實(shí)現(xiàn)自動監(jiān)聽某布爾型變量來改變元素顯示狀態(tài)。下面跟著小編一起來看下吧
    2017-04-04
  • AngularJS入門教程之XHR和依賴注入詳解

    AngularJS入門教程之XHR和依賴注入詳解

    本文主要介紹AngularJS XHR和依賴注入,這里整理了詳細(xì)資料和示例代碼,有興趣的小伙伴可以參考下
    2016-08-08
  • AngularJS中下拉框的高級用法示例

    AngularJS中下拉框的高級用法示例

    這篇文章主要介紹了AngularJS中下拉框的高級用法,結(jié)合實(shí)例形式分析了AngularJS下拉框的遍歷、選擇、綁定、顯示等功能實(shí)現(xiàn)方法,需要的朋友可以參考下
    2017-10-10
  • Bootstrap和Angularjs配合自制彈框的實(shí)例代碼

    Bootstrap和Angularjs配合自制彈框的實(shí)例代碼

    今天小編通過本文給大家分享Bootstrap和Angularjs配合自制彈框的實(shí)例代碼,代碼簡單易懂,有需要的朋友跟著小編一起學(xué)習(xí)
    2016-08-08
  • 淺談Angular的12個經(jīng)典問題

    淺談Angular的12個經(jīng)典問題

    Angular作為目前最為流行的前端框架,受到了前端開發(fā)者的普遍歡迎。不論是初學(xué)Angular的新手,還是有一定Angular開發(fā)經(jīng)驗(yàn)的開發(fā)者,了解本文中的12個經(jīng)典面試問題,都將會是一個深入了解和學(xué)習(xí)Angular2的知識概念的絕佳途徑。
    2021-05-05
  • Angular實(shí)現(xiàn)跨域(搜索框的下拉列表)

    Angular實(shí)現(xiàn)跨域(搜索框的下拉列表)

    angular.js 自帶jsonp,實(shí)現(xiàn)跨域,下面來實(shí)現(xiàn)搜索框的下拉列表功能,本文思路明確,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-02-02
  • Angular懶加載機(jī)制刷新后無法回退的快速解決方法

    Angular懶加載機(jī)制刷新后無法回退的快速解決方法

    使用oclazyload懶加載angular的模塊,刷新頁面后,單擊回退按鈕無法返回上一個頁面.怎么回事呢?下面小編給大家?guī)砹薬ngular懶加載機(jī)制刷新后無法回退的快速解決方法,非常不錯,感興趣的朋友參考下
    2016-08-08

最新評論