中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Angular4中FactoryProvidervue

發布時間:2021-08-10 11:15:49 來源:億速云 閱讀:82 作者:小新 欄目:web開發

這篇文章主要為大家展示了“Angular4中FactoryProvidervue”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Angular4中FactoryProvidervue”這篇文章吧。

開發環境及開發語言:

  • Angular 4 +

  • Angular CLI

  • TypeScript

基礎知識

FactoryProvider 的作用

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

FactoryProvider 的使用

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

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

FactoryProvider 接口

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

FactoryProvider

介紹完基礎知識,接下來我們馬上進入正題。不知道大家是否還記得,之前我們創建過的 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();
 }
}

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

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

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

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

創建 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: (?).

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

ERROR Error: No provider for Boolean!

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

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

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

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

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

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

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

具體如下:

使用 FactoryProvider

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

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

LoggerService: Fetching heros...

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

向AI問一下細節

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

AI

循化| 酉阳| 嘉兴市| 信丰县| 曲周县| 桦南县| 广昌县| 合肥市| 伊宁县| 浪卡子县| 富宁县| 通许县| 慈溪市| 永宁县| 甘洛县| 神池县| 香格里拉县| 福贡县| 新绛县| 宁国市| 新邵县| 礼泉县| 阳原县| 延寿县| 胶州市| 瑞昌市| 绥宁县| 临高县| 池州市| 全椒县| 平乡县| 杂多县| 平山县| 永宁县| 冷水江市| 邵阳市| 金寨县| 多伦县| 陇南市| 凭祥市| 龙口市|