[英]What is the need for @Inject and Injectable in Angular DI?
constructor(private smartphoneService: smartphoneService) { }
我可以在沒有錯誤的情況下運行以上代碼。 但是為什么我們要在服務,管道等上使用@Inject和Injectable。 為什么以及在何處需要使用此功能?
import { Injectable } from '@angular/core';
import {SmartphoneListComponent} from './smartphone-list/smartphone-list.component';
@Injectable()
export class smartphoneService{
smartphones: any = [
{id: '1', name: 'iPhone6', status: 'active'},
{id: '2', name: 'iPhone6S', status: 'active'},
{id: '3', name: 'iPhone7', status: 'active'},
{id: '4', name: 'iPhone7Plus', status: 'active'},
{id: '5', name: 'iPhoneX', status: 'future'}
];
constructor() { }
}
您需要在注入依賴項並將使用類類型注入的服務上使用@Injectable
:
@Injectable()
class A { constructor (b: B) {} }
class C { constructor (c: C) {} }
如果服務不注入依賴@Injectable
則無需使用@Injectable
:
class A { constructor () {} }
class C { constructor (c: C) {} }
或者使用@Inject
裝飾器進行注入:
class A { constructor (b: B) {} }
class C { constructor (@Inject(C) c) {} }
基本上,您可以使用任何裝飾器代替@Injectable
。 這將起作用:
function Custom(target) {}
@Custom
class A { constructor (b: B) {} }
class C { constructor (c: C) {} }
這是因為當Angular試圖了解將哪些可注入對象傳遞給類構造函數時,它將使用類的元數據。 僅當您在tsconfig.json
具有emitDecoratorMetadata: true
且任何裝飾器都應用於類時,TypeScript才會生成此元數據。
角不使用由打字稿產生的,當你使用元數據@Inject
裝飾明確的,這就是為什么你不需要申請@Injectable
如果使用@Inject
。 @Inject
最常見的用例是通過引用而不是類型來注入對象:
const token1 = new InjectionToken('my');
const token2 = 's';
class C { constructor (@Inject(token1) t1, @Inject(token2) t2) {} }
Angular文檔為您的問題提供了答案:
@Injectable()將一個類標記為可用於注入器以進行實例化。 一般來說,注入器在嘗試實例化未標記為@Injectable()的類時會報告錯誤。
除此之外,出於以下原因,他們建議將注釋放在每個服務類上:
這是文檔的鏈接: https : //angular.io/guide/dependency-injection#why-injectable
組件由Angular實例化,並且已經由@Component裝飾。 暗含@Inject。 那么為什么要強迫開發人員使用@Inject for Components?
OTOH如果Angular需要@Inject作為其構造函數,那么擁有未注入的構造函數arg是什么意思? 因為它沒有注入並且Angular必須創建實例,所以它變成了無意義的arg? 然后,我們將不得不強制每個參數都標記為@inject。
服務看起來像一流的JavaScript類。 域實體類也是如此。 但是,服務不攜帶狀態,因此,在同一個服務類中懸掛多個實例是毫無意義的。 OTOH實體可以是同一類的多個實例。 現在,由於這兩種類型的類看起來相似,我們如何告訴Angular哪個類是Singleton,最重要的是,我們如何告訴Angular我們需要在某個地方注入實例。 在DI中,我們說的是我想要一個類的實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.