網站首頁 編程語言 正文
看一個實際的例子:
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
相關推薦
- 2022-03-20 詳解C語言對字符串處理函數的實現方法_C 語言
- 2022-10-21 React封裝全屏彈框的方法_React
- 2022-04-18 使用numpy對數組求平均時如何忽略nan值_python
- 2022-07-08 Qt5?串口類QSerialPort的實現_C 語言
- 2022-05-31 openCV實現圖像融合的示例代碼_python
- 2022-12-09 Python曲線擬合多項式深入詳解_python
- 2023-01-11 Android?nonTransitiveRClass資源沖突問題淺析_Android
- 2024-03-18 SpringBoot + Mybatis 多數據源配置打印SQL失效問題(mybatis.confi
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支