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

學無先后,達者為師

網站首頁 編程語言 正文

Angular @Inject 注解的實際應用例子和工作原理淺析

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

看一個實際的例子:

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
  }
}

此時,@Inject 是指定此查找標記的手動方式,后跟小寫的 http 參數告訴 Angular 分配它的對象。

當組件或服務需要大量依賴項時,這可能(并且將會)變得非常混亂。 由于 Angular 支持從發出的元數據中解析依賴關系,因此大多數時候不需要使用 @Inject。

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

我們使用@Inject 的原因是因為我們不能使用 OpaqueToken 作為參數的類型,例如下面的代碼將不會工作:

const myToken = new OpaqueToken('myValue');

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

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

const myToken = new OpaqueToken('myValue');

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

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

再看另一個例子:

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) { }
}

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

使用 TypeScript 時,@Inject 僅用于注入原語(primitives)。 TypeScript 的類型讓 Angular 在大多數情況下知道該做什么。 上面的示例將在 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

欄目分類
最近更新