Angular 14前的HttpInterceptor用法
在Angular14之前用HttpInterceptor不外乎就是建立一個服務並且實作HttpInterceptor介面,然後寫一個方便註冊的Provider
Angular 14後的HttpInterceptor用法
當Angular 14發佈standalone component後,也可以將整個Application轉換成standalone application,而轉換後將不再有app.modules.ts,這時候就會遇到第一個困難就是providers要加在哪裡?天真的我以為standalone就直接在imports裡面使用就可以,但事情似乎沒有這麼簡單XD,這裡我拿IonicModule.forRoot()當作範例可以參考下圖的錯誤訊息
可以看到第二個參數是帶入一個ApplicationConfig參數,而這裡就是新的設定provider的地方,是說我以前好像很少會關注main.ts這個檔案XD
💡ApplicationConfig提供了providers的屬性
接著我們把HttpInterceptorProvider加到bootstrapApplication的providers內,存檔後執行會發現console.log報錯:No provider for Httpclient !,該錯誤是因為沒有引入HttpClientModule
天真無邪的我又以為在AppComponent Import HttpClientModule就可以,不過人生不會是一帆風順的,問題依舊還在,後來一番研究才發現原來答案就在importProvidersFrom(其實上圖就有了XD),把HttpClientModule帶入importProvidersFrom後就可以正常運行了!
Angular 15後的HttpInterceptor用法
改成provideHttpClient並且在使用時可能會發現HttpInterceptor並沒有正確被執行,這是因為改成provideHttpClient後需要添加參數才能啟用特定的功能,如:HttpInterceptor。由於HttpInterceptor是一個服務因此加入withInterceptorsFromDi(),它可以告訴應用程式你的HttpInterceptor是一個Di注入的服務
它的用法就跟Router Guard的概念一樣,捨棄了服務,改成Function。另外如果在Function內要使用其它Service也可以使用Angular 14加強後的inject方法取得我們要的Service,這樣也不用擔心改成Function後沒地方取得Service的問題!
總結
自從出了standalone後整個專案變得很多(少了很多Module),也因為換成了standalone,在使用HttpInterceptor時從一個服務變成一個function整體來說是簡化了不少,至於要用什麼方式就看個人的習慣而定沒有一定哦!但是真要選的話我更喜歡使用function簡潔有力的寫法,另外官方文檔也有提到withInterceptorsFromDi在未來的版本可能會淘汰
0 Comments
張貼留言