最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Angular 4 依賴注入學習教程之FactoryProvider的使用(四)

 更新時間:2017年06月04日 09:44:05   作者:semlinker  
這篇文章主要給大家介紹了關于Angular 4 依賴注入之FactoryProvider使用的相關資料,文中介紹的非常詳細,對大家學習或者使用Angular4具有一定的參考學習價值,需要的朋友們下面來一起看看吧。

學習目錄

前言

本文屬于Angular 4 依賴注入學習系列的第四篇,主要介紹了Angular 4 依賴注入之FactoryProvider的使用,感興趣的朋友們下面來看看詳細的介紹:

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

基礎知識

FactoryProvider 的作用

FactoryProvider 用于告訴 Injector (注入器),通過調用 useFactory 對應的函數(shù),返回 Token 對應的依賴對象。

FactoryProvider 的使用

function serviceFactory() { 
 return new Service();
}

const provider: FactoryProvider = {
 provide: 'someToken', useFactory: serviceFactory, deps: []
};

FactoryProvider 接口

export interface FactoryProvider {
 // 用于設置與依賴對象關聯(lián)的Token值,Token值可能是Type、InjectionToken、
 // OpaqueToken的實例或字符串
 provide: any;
 // 設置用于創(chuàng)建對象的工廠函數(shù)
 useFactory: Function;
 // 依賴對象列表
 deps?: any[];
 // 用于標識是否multiple providers,若是multiple類型,則返回與Token關聯(lián)的依賴
 // 對象列表
 multi?: boolean;
}

FactoryProvider

介紹完基礎知識,接下來我們馬上進入正題。不知道大家是否還記得,之前我們創(chuàng)建過的 HeroComponent 組件:

import { Component, OnInit } from '@angular/core';
import { HeroService } from '../hero.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 {

 constructor(private heroService: HeroService) { }

 heros: Array<{ id: number; name: string }>;

 ngOnInit() {
 this.heros = this.heroService.getHeros();
 }
}

那么現(xiàn)在問題來了,假設我們想在獲取英雄數(shù)據(jù)時,輸出調試信息,那應該怎么辦?What ~,這個問題不是很簡單么,直接使用 console.log API 輸出相應信息不就行了么:

console.log('Fetching heros...');
this.heros = this.heroService.getHeros();

那問題又來了,如果多個組件都使用 HeroService 去獲取英雄數(shù)據(jù),那么是不是每個組件都得添加對應的語句。另外如果要修改輸出的調試信息,那就得修改程序中多個地方。其實我們一般只需要在開發(fā)階段,輸出調試信息,因此上面的方案不合理,也不夠靈活。

其實我們可以借鑒之前引入 HeroService 服務的思路,創(chuàng)建一個 LoggerService 來解決上面提到的問題。

創(chuàng)建 LoggerService 服務

export class LoggerService {
 constructor(private enable: boolean) { }

 log(message: string) {
 if(this.enable) {
  console.log(`LoggerService: ${message}`);
 }
 }
}

配置 LoggerService 服務

@NgModule({
 ...
 providers: [
 HeroService,
 LoggerService
 ],
 bootstrap: [AppComponent]
})
export class AppModule { }

使用 LoggerService 服務

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.heros = this.heroService.getHeros();
 }
}

以上代碼運行后會拋出以下異常信息:

Uncaught Error: Can't resolve all parameters for LoggerService: (?).

有的讀者,眼睛一亮,可能是你在創(chuàng)建 LoggerService 服務時,忘記使用 @Injectable 裝飾器了。哈哈,其實我是故意的,但我加上 @Injectable() 后,還是拋出了以下異常:

ERROR Error: No provider for Boolean!

為什么會出現(xiàn)上面的異常信息呢?我們再看一下前面創(chuàng)建的 LoggerService 服務:

export class LoggerService {
 constructor(private enable: boolean) { }
 // ...
}

在 Angular 中我們通過構造注入的方式注入依賴對象, private enable: boolean 這種方式表示我們要注入 Type 類型的對象。然后 boolean 是表示基本數(shù)據(jù)類型,并不是所需的 Type 類型:

export function isType(v: any): v is Type<any> {
 return typeof v === 'function';
}

接下來我們再來看一下最早拋出的異常:

Uncaught Error: Can't resolve all parameters for LoggerService: (?).

其實問題的答應也在 LoggerService 類的構造函數(shù)中,在創(chuàng)建 LoggerService 對象時,我們需要設置 enable 參數(shù)的值。那么如何解決呢? 當然可以使用我們的主角 - FactoryProvider 。

具體如下:

使用 FactoryProvider

@NgModule({
 ...,
 providers: [
 HeroService,
 {
 provide: LoggerService, 
 useFactory: () => {
 return new LoggerService(true);
 }
 }
 ],
 bootstrap: [AppComponent]
})
export class AppModule { }

當更新完代碼,然后再來一個華麗的保存操作,最后打開你的控制臺,你將看到預期的輸出信息:

LoggerService: Fetching heros...

難道就這樣結束了,關于 FactoryProvider 的相關內容先告一段落,下一篇我們將介紹如何使用 FactoryProvider 配置依賴對象。

總結

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

相關文章

  • angularjs實現(xiàn)首頁輪播圖效果

    angularjs實現(xiàn)首頁輪播圖效果

    這篇文章主要為大家詳細介紹了angularjs實現(xiàn)首頁輪播圖效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Angular2 多級注入器詳解及實例

    Angular2 多級注入器詳解及實例

    這篇文章主要介紹了Angular2 多級注入器詳解的相關資料,并附簡單實例代碼,需要的朋友可以參考下
    2016-10-10
  • Angular中實現(xiàn)樹形結構視圖實例代碼

    Angular中實現(xiàn)樹形結構視圖實例代碼

    近兩年當中使用Angular開發(fā)過很多項目,其中也涉及到一些樹形結構視圖的顯示,最近的在項目中封裝了大量的組件,一些組件也有樹形結構的展示,所以寫出來總結一下。
    2017-05-05
  • AngularJS實現(xiàn)的獲取焦點及失去焦點時的表單驗證功能示例

    AngularJS實現(xiàn)的獲取焦點及失去焦點時的表單驗證功能示例

    這篇文章主要介紹了AngularJS實現(xiàn)的獲取焦點及失去焦點時的表單驗證功能,涉及AngularJS使用ng-blur、ng-focus針對表單事件監(jiān)聽相關操作技巧,需要的朋友可以參考下
    2017-10-10
  • AngularJS實現(xiàn)圖片上傳和預覽功能的方法分析

    AngularJS實現(xiàn)圖片上傳和預覽功能的方法分析

    這篇文章主要介紹了AngularJS實現(xiàn)圖片上傳和預覽功能的方法,結合HTML5實例形式對比分析了AngularJS圖片上傳的相關操作技巧與注意事項,需要的朋友可以參考下
    2017-11-11
  • AngularJS2 與 D3.js集成實現(xiàn)自定義可視化的方法

    AngularJS2 與 D3.js集成實現(xiàn)自定義可視化的方法

    本篇文章主要介紹了ANGULAR2 與 D3.js集成實現(xiàn)自定義可視化的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 詳解如何在Angular中引入Mock.js

    詳解如何在Angular中引入Mock.js

    這篇文章主要為大家介紹了詳解如何在Angular中引入Mock.js實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • AngularJS實現(xiàn)進度條功能示例

    AngularJS實現(xiàn)進度條功能示例

    這篇文章主要介紹了AngularJS實現(xiàn)進度條功能,結合具體完整實例形式分析了AngularJS實現(xiàn)進度條功能的原理、相關知識點與注意事項,需要的朋友可以參考下
    2017-07-07
  • 使用Angular 6創(chuàng)建各種動畫效果的方法

    使用Angular 6創(chuàng)建各種動畫效果的方法

    Angular能夠讓我們創(chuàng)建出具有原生表現(xiàn)效果的動畫。我們將通過本文學習到如何使用Angular 6來創(chuàng)建各種動畫效果。在此,我們將使用Visual Studio Code來進行示例演示。感興趣的朋友跟隨小編一起看看吧
    2018-10-10
  • Angular如何引入第三方庫的方法詳解

    Angular如何引入第三方庫的方法詳解

    本篇文章主要介紹了Angular如何引入第三方庫的方法詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07

最新評論

汝南县| 长治县| 井研县| 江山市| 朔州市| 宁国市| 综艺| 敦化市| 贵定县| 堆龙德庆县| 关岭| 桃园县| 朔州市| 达拉特旗| 永清县| 通江县| 陇南市| 宣恩县| 启东市| 吉林市| 庆阳市| 建宁县| 永胜县| 当阳市| 岫岩| 尤溪县| 曲靖市| 都安| 新昌县| 神农架林区| 佛教| 历史| 肥乡县| 阿瓦提县| 馆陶县| 石首市| 罗山县| 鄂州市| 丰城市| 曲周县| 湘西|