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

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Angular @Inject 注解的實(shí)際應(yīng)用例子和工作原理淺析

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

看一個(gè)實(shí)際的例子:

import { Component, Inject } from '@angular/core';
import { Http } from '@angular/http';

@Component({
  selector: 'example-component',
  template: '<div>I am a component</div>'
})
class ExampleComponent {
  constructor(@Inject(Http) private http) {
    // use `this.http` which is the Http provider
  }
}

此時(shí),@Inject 是指定此查找標(biāo)記的手動(dòng)方式,后跟小寫的 http 參數(shù)告訴 Angular 分配它的對象。

當(dāng)組件或服務(wù)需要大量依賴項(xiàng)時(shí),這可能(并且將會(huì))變得非常混亂。 由于 Angular 支持從發(fā)出的元數(shù)據(jù)中解析依賴關(guān)系,因此大多數(shù)時(shí)候不需要使用 @Inject。

我們唯一需要使用 @Inject 的地方是像 OpaqueToken 這樣的場景——它創(chuàng)建一個(gè)唯一的空白令牌,用作依賴注入提供程序。

我們使用@Inject 的原因是因?yàn)槲覀儾荒苁褂?OpaqueToken 作為參數(shù)的類型,例如下面的代碼將不會(huì)工作:

const myToken = new OpaqueToken('myValue');

@Component(...)
class ExampleComponent {
  constructor(private token: myToken) {}
}

在這里,myToken 不是類型,它是一個(gè)值——這意味著 TypeScript 無法編譯它。 但是,當(dāng)我們將 @Inject 與 OpaqueToken 一起引入時(shí),整個(gè)依賴注入會(huì)重新開始工作:

const myToken = new OpaqueToken('myValue');

@Component(...)
class ExampleComponent {
  constructor(@Inject(myToken) private token) {
    // use the provider for `token`
  }
}

上面提供了一個(gè)使用 @Inject 手動(dòng)指定要注入的令牌的示例,并顯示該令牌可以是任何值。 這意味著在 Angular 依賴注入的場景里,我們并不限于 TypeScript 歸類為“類型”的內(nèi)容。

再看另一個(gè)例子:

import { Component, Inject } from '@angular/core';
import { ChatWidget } from '../components/chat-widget';

@Component({
  selector: 'app-root',
  template: `Encryption: {{ encryption }}`
})
export class AppComponent {
  encryption = this.chatWidget.chatSocket.encryption;

  constructor(@Inject(ChatWidget) private chatWidget) { }
}

在上面我們通過調(diào)用 @Inject(ChatWidget) 要求chatWidget 成為Angular 與類符號ChatWidget 相關(guān)聯(lián)的單例。 重要的是要注意,我們使用 ChatWidget 進(jìn)行類型化并作為對其單例的引用。 我們沒有使用 ChatWidget 來實(shí)例化任何東西,Angular 在幕后為我們做這件事。

使用 TypeScript 時(shí),@Inject 僅用于注入原語(primitives)。 TypeScript 的類型讓 Angular 在大多數(shù)情況下知道該做什么。 上面的示例將在 TypeScript 中簡化為:

import { Component } from '@angular/core';
import { ChatWidget } from '../components/chat-widget';

@Component({
  selector: 'app',
  template: `Encryption: {{ encryption }}`
})
export class App {
  encryption = this.chatWidget.chatSocket.encryption;

  constructor(private chatWidget: ChatWidget) { }
}

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

欄目分類
最近更新