簡體   English   中英

Angular DI中對@Inject和Injectable有什么需求?

[英]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

@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()的類時會報告錯誤。

除此之外,出於以下原因,他們建議將注釋放在每個服務類上:

  • 將來的證明:以后添加依賴項時,無需記住@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM