網站首頁 編程語言 正文
一個常見的誤解是,@Injectable()
是我們計劃在應用程序中注入組件/服務的任何類的必需裝飾器。 這種說法并不完全正確。
當使用 Angular 裝飾器時,被裝飾的類以 Angular 可以讀取的格式存儲關于自身的元數據——這包括關于它需要獲取和注入哪些依賴項的元數據。
如果一個類上沒有使用 Angular 裝飾器,那么 Angular 就無法讀取它需要的依賴項。 這就是我們需要使用@Injectable() 的原因。
如果我們的服務注入提供者,我們必須添加 @Injectable(),這個注解除了告訴 Angular 存儲它需要的元數據之外,沒有實現其他額外的功能。
假設我們有下面這個 Service class:
export class UserService {
isAuthenticated(): boolean {
return true;
}
}
對于上面這個類,我們不需要用 @Injectable
裝飾它,以便能夠將其注入到組件中。因為 UserService 本身不注入任何 providers.
然而如果我們的 Service 類本身又注入了其他的依賴:
import { Http } from '@angular/http';
export class UserService {
constructor(private http: Http) {}
isAuthenticated(): Observable<boolean> {
return this.http.get('/api/user').map((res) => res.json());
}
}
上面的代碼無法正常工作,因為 Http 提供程序元數據不會被存儲以供 Angular 正確組合。
解決方案就是使用 @Injectable
注解:
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
@Injectable()
export class UserService {
constructor(private http: Http) {}
isAuthenticated(): Observable<boolean> {
return this.http.get('/api/user').map((res) => res.json());
}
}
SAP Spartacus 的例子:
對于用于 DI 的控制反轉 (IOC) 容器,開發人員通常需要完成兩種設置。 首先是令牌。 要向 IOC 容器注冊依賴,需要提供一個令牌。 令牌是注冊任何服務的獨一無二的標識符。 第二件事是配置 provider 本身。 提供者幫助 DI 容器創建特定依賴項的運行時實例。
在 Angular 中,使用令牌注冊服務,并將其傳遞給提供者的具體方法如下所述:
首先,可以使用特定的@NgModule 注冊服務。 該過程是通過將服務傳遞給提供者數組來進行注冊。 下面是一個例子,使用的令牌是 typescript 類型 MyService
. 這里的提供者是 useClass. 這個提供者策略,通知 Angular DI 框架,可以通過 new 關鍵字來實例化某個依賴項。
例子代碼:
@NgModule({
...
providers: [
// long hand syntax
{provide: MyService, useClass: MyService},
// short hand syntax
MyService
],
})
注意上面提供了兩種語法,因為 provide 和 useClass 指向的 type 定義相同,所以可以直接簡寫成 MyService
.
原文鏈接:https://blog.csdn.net/i042416/article/details/125855654
相關推薦
- 2022-06-04 python實現對doc,txt,xls文檔的讀寫操作_python
- 2021-10-24 Linux多線程中fork與互斥鎖過程示例_Linux
- 2022-05-31 Android接入ffmpeg庫及問題解決方法_Android
- 2022-05-12 小程序滾動穿透解決方案
- 2023-03-17 Docker部署Nginx并修改配置文件的兩種方式_docker
- 2022-10-07 Android開發Jetpack組件Lifecycle使用篇_Android
- 2023-01-31 golang定時任務cron項目實操指南_Golang
- 2022-09-10 Python遞歸實現猴子吃桃問題及解析_python
- 最近更新
-
- 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同步修改后的遠程分支