日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

關于 Angular 注解 @Injectable() 使用的一些誤區

作者:汪子熙 更新時間: 2022-07-19 編程語言

一個常見的誤解是,@Injectable() 是我們計劃在應用程序中注入組件/服務的任何類的必需裝飾器。 這種說法并不完全正確。

當使用 Angular 裝飾器時,被裝飾的類以 Angular 可以讀取的格式存儲關于自身的元數據——這包括關于它需要獲取和注入哪些依賴項的元數據。

如果一個類上沒有使用 Angular 裝飾器,那么 Angular 就無法讀取它需要的依賴項。 這就是我們需要使用@Injectable() 的原因。

如果我們的服務注入提供者,我們必須添加 @Injectable(),這個注解除了告訴 Angular 存儲它需要的元數據之外,沒有實現其他額外的功能。

假設我們有下面這個 Service class:

export class UserService {
  isAuthenticated(): boolean {
    return true;
  }
}

對于上面這個類,我們不需要用 @Injectable裝飾它,以便能夠將其注入到組件中。因為 UserService 本身不注入任何 providers.

然而如果我們的 Service 類本身又注入了其他的依賴:

import { Http } from '@angular/http';

export class UserService {
  constructor(private http: Http) {}
  isAuthenticated(): Observable<boolean> {
    return this.http.get('/api/user').map((res) => res.json());
  }
}

上面的代碼無法正常工作,因為 Http 提供程序元數據不會被存儲以供 Angular 正確組合。

解決方案就是使用 @Injectable 注解:

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';

@Injectable()
export class UserService {
  constructor(private http: Http) {}
  isAuthenticated(): Observable<boolean> {
    return this.http.get('/api/user').map((res) => res.json());
  }
}

SAP Spartacus 的例子:

對于用于 DI 的控制反轉 (IOC) 容器,開發人員通常需要完成兩種設置。 首先是令牌。 要向 IOC 容器注冊依賴,需要提供一個令牌。 令牌是注冊任何服務的獨一無二的標識符。 第二件事是配置 provider 本身。 提供者幫助 DI 容器創建特定依賴項的運行時實例。

在 Angular 中,使用令牌注冊服務,并將其傳遞給提供者的具體方法如下所述:

首先,可以使用特定的@NgModule 注冊服務。 該過程是通過將服務傳遞給提供者數組來進行注冊。 下面是一個例子,使用的令牌是 typescript 類型 MyService. 這里的提供者是 useClass. 這個提供者策略,通知 Angular DI 框架,可以通過 new 關鍵字來實例化某個依賴項。

例子代碼:

@NgModule({
  ...
  providers: [
    // long hand syntax
  	{provide: MyService, useClass: MyService},
  	// short hand syntax
  	MyService
  ],
})

注意上面提供了兩種語法,因為 provide 和 useClass 指向的 type 定義相同,所以可以直接簡寫成 MyService.

原文鏈接:https://blog.csdn.net/i042416/article/details/125855654

欄目分類
最近更新