依賴注入
創建服務需要用到Injectable,@Injectable() 裝飾器把類標記為可供注入的服務,不過在使用該服務的 provider 配置好 Angular 的依賴注入器之前,Angular 實際上無法將其注入到任何位置。
provider告訴注入器如何創建該服務,可以通過設置元數據來配置注入器(3種方式):
在服務本身的 @Injectable() 裝飾器中。 在 NgModule 的 @NgModule() 裝飾器中。 在組件的 @Component() 裝飾器中。@Injectable() 裝飾器具有一個名叫 providedIn 的元數據選項,在這里指定把被裝飾類的provider放到 root 注入器中,或某個特定 NgModule 的注入器中。
@NgModule() 和 @Component() 裝飾器都有用一個 providers 元數據選項,在那里你可以配置 NgModule 級或組件級的注入器。
注入器與服務實例
在某個注入器范圍內,服務是單例的。應用只有一個根注入器,angular具有多級注入器系統,以為者下級注入器可以創建自己的服務實例。
每當 Angular 創建一個在 @Component() 中指定了 providers 的組件實例時,它也會為該實例創建一個新的子注入器。 類似的,當在運行期間加載一個新的 NgModule 時(即lazy module),Angular 也可以為它創建一個擁有自己的提供商的注入器。
借助注入器繼承機制,仍然可以把全應用級的服務注入到這些組件中。 組件的注入器是其父組件注入器的子節點,也是其父節點的父節點的后代,以此類推,直到應用的根注入器為止。 Angular 可以注入該繼承譜系中任何一個注入器提供的服務。
模塊化編程時,service、component、pipe等最好都放在module中,需要引入這些服務時,通過導入module來引用,不要直接import service 和component,這不符合模塊化思想。
多級注入系統
應用程序中有一個與組件樹平行的注入器樹,對于在什么級別上注入會最終導致:
最終包的大小 服務的范圍 服務的生命周期當在服務自身的@Injectable()裝飾器中指定provider時,CLI生產模式所用的優化工具可以進行搖樹優化,它會移除那些沒有用過的服務,搖樹優化生成的包更小。
三級provider
root級,是AppModule全局的,配置方法已提。 NgModule級,兩種方法:可以在module的@NgModule 的 provider 元數據中指定;也可以在@injectable() 的providerIn選項中指定某個模塊類如果模塊是lazy modole,需要使用@NgModule的provider選項。
組件級為每個component實例配置自己的注入器無論對于根級注入器還是模塊級注入器,服務實例的生存期都和應用或模塊本身相同。Angular 可以把這個服務實例注入到任何需要它的類中(即app內是單例的)。Angular 只能把相應的服務注入到該組件實例或其下級組件實例中,而不能把這個服務實例注入到其它地方(即組件內并不是單例的)。
新聞熱點
疑難解答
圖片精選