Angular 4 依賴注入學習教程之FactoryProvider的使用(四)
學習目錄
- Angular 4 依賴注入教程之一 依賴注入簡介
- Angular 4 依賴注入教程之二 組件服務注入
- Angular 4 依賴注入教程之三 ClassProvider的使用
- Angular 4 依賴注入教程之四 FactoryProvider的使用
- Angular 4 依賴注入教程之五 FactoryProvider配置依賴對象
- Angular 4 依賴注入教程之六 Injectable 裝飾器
- Angular 4 依賴注入教程之七 ValueProvider的使用
- Angular 4 依賴注入教程之八 InjectToken的使用
前言
本文屬于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能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
Angular2 Service實現(xiàn)簡單音樂播放器服務
本篇文章主要介紹了Angular2 Service實現(xiàn)簡單音樂播放器服務 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Angularjs中如何使用filterFilter函數(shù)過濾
這篇文章主要介紹了Angularjs中如何使用filterFilter函數(shù)過濾的相關資料,需要的朋友可以參考下2016-02-02AngularJS實現(xiàn)動態(tài)編譯添加到dom中的方法
這篇文章主要介紹了AngularJS實現(xiàn)動態(tài)編譯添加到dom中的方法,結合實例形式分析了AngularJS動態(tài)編輯構建模板的相關操作技巧,需要的朋友可以參考下2016-11-11Angularjs的$http異步刪除數(shù)據(jù)詳解及實例
這篇文章主要介紹了Angularjs的$http異步刪除數(shù)據(jù)詳解及實例的相關資料,這里提供實現(xiàn)思路及實現(xiàn)具體的方法,需要的朋友可以參考下2017-07-07