理解 Angular 服務

2022-07-12 17:36:25 字數 1900 閱讀 9630

本文寫於 2021 年 3 月 29 日

該在**注入服務

angular 的最佳實踐推薦業務邏輯要盡量分門別類的抽離為乙個個的 service。

那麼到底什麼是 service 呢?

service 意為服務,是乙個廣義的概念。

例如:飯館提供的是吃飯服務、澡堂提供的是洗澡服務、學校提供的是授課服務……

那麼對於寫**來說,服務是什麼呢?

服務一般會包括值/狀態、函式或各種特性,在 angular 中,我們使用乙個 class 來包裹這些。

但實際上,服務可以不是乙個類,例如 react 的 context,通過閉包得到的返回值也可以是乙個服務。

歸根結底,可以這麼總結:把一系列高度聚合的**放到一起,就是乙個服務

對於前端來說,操心的事情其實有兩件:

使用者體驗(動畫、跳轉、樣式……)

業務邏輯與狀態管理

angular 推薦我們將第二點放到服務中來完成,從而令元件可以專心的負責使用者體驗。

比如從伺服器獲取資料、驗證使用者輸入、日誌……都應該放在服務,而不是特定的元件中。

當我們將這些委託給了各種可注入的服務之後,就可以將其注入到各個元件或者其他服務中進行呼叫。讓你的**更具適應性。

在 angular 中,服務通常是乙個單例。

**來自 angular 官方文件,有刪改

// 省略 @injectable **

export class logger

error(msg: any)

warn(msg: any)

}

在 ng 元件或是 service 的建構函式中注入服務(框架會幫我們自動完成)後即可在其他方法中呼叫。

// 省略 @injectable **

export class heroservice

getheroes() `);

});}}

當 angular 建立元件類的新例項時,框架會檢視該元件類的 constructor,得到該元件依賴哪些服務或其它依賴項。

如果發現了某個元件依賴某個服務,框架會首先檢查注入器中是否已經有了那個服務的例項。如果存在,直接返回;如果不存在,注入器就會使用以前註冊的服務提供者來創造乙個,並把它加入注入器中,最後把該服務返回。

服務需要「提供」,才能使用。

1. 在服務中註冊

@injectable()

export class someservice {}

預設情況下,服務會提供給root,也就是根。這樣該服務就可以在任何 module 的元件進行注入。

這種在@injectable元資料中註冊提供者的方式還讓 angular 能夠通過移除那些從未被用過的服務來優化大小。

2. 在 module 中註冊

@ngmodule()
你也可以提供給單獨的 module,讓 service 只能在該 module 使用。

3. 在元件中註冊

@component()
當你在元件級註冊提供者時,你會為該元件的每乙個新例項提供該服務的乙個新例項!!!

所以不推薦這麼做。

angular 使得我們可以在任何的元件中注入服務,這會使得我們「濫用」注入。

這裡我們借用一些 react-redux 中的概念——展示元件和容器元件。

在展示元件中,應該只負責定義自己需要的狀態、方法,具體的依賴於外層傳入。

在容器元件中,才可以注入服務進行操作。

這樣能有效的降低元件對於特定服務的依賴。

(完)

angular中的服務的理解以及使用

通過命令ng g service 服務名稱 或者ng g service services 服務名稱 可以建立服務名稱.service.ts的檔案 2.1 首先需要在根模組中設定,首先需要匯入服務 inport from service storage.service 其次在 ngmodule的pr...

angular中的服務

angular中的服務 angular中的服務相當於乙個狀態管理,可以將資料放在服務裡面進行獲取以及編輯。服務的安裝命令 ng g service count安裝好後,會在服務的ts檔案中引入乙個injectable模組,這是乙個服務裝飾器,可以通過 injectable 將乙個類裝飾成乙個服務。i...

Angular基本概念理解

nztable 模組變數 輸入 繫結值 輸出 繫結事件 補充說明 是控制項監控外部變化 是監聽事件,交給外部變化內部值的權利 二者都是 監聽 非一次性 name a a發生變化,name一直跟著改變,但是name發生變化,a不改變 總之寫在哪個元件,哪個元件就被動接受值 寫在哪個元件,就是監聽哪個元...