Angular 把組件和效勞區脫離,以進步模塊性和復用性。
- 經由過程把組件中和視圖有關的功用與其他範例的處置懲罰分脫離,你能夠讓組件類越發精簡、高效。 抱負情況下,組件的事情儘管用戶體驗,而不必顧及別的。 它應當供運用於數據綁定的屬性和要領,以便作為視圖(由模板襯着)和運用邏輯(一般包括一些模子的觀點)的中介者。
- 組件不應當定義任何諸如從效勞器獵取數據、考證用戶輸入或直接往掌握台中寫日記等事情。 而要把這些使命託付給種種效勞。經由過程把種種處置懲罰使命定義到可注入的效勞類中,你能夠讓它能夠被任何組件運用。 經由過程在差別的環境中注入同一種效勞的差別供應商,你還能夠讓你的運用更具適應性。
Angular 不會強迫遵照這些準繩。它只會經由過程依靠注入讓你能更容易地將運用邏輯分解為效勞,並讓這些效勞可用於各個組件中。
在Angular中運用效勞,起首根據需要的功用,寫一個效勞類(angular中稱為provider),然後將該效勞類註冊到注入器中(運用啟動時自動建立),以後就能夠在組件類或其他效勞中經由過程Angular的依靠注入體系運用了,Angular會自動將該類實例化,並處置懲罰好依靠關聯.
在Angular中有許多體式格局能夠將效勞類註冊到注入器中:
- @Injectable 元數據中的
providedIn
屬性 - @NgModule 元數據中的
providers
屬性 - @Component 元數據中的
providers
屬性
差別的註冊體式格局,天生的效勞也有所差別.
在效勞類的
@Injectable
裝潢器中://service @Injectable({ providedIn: 'root', })
providedIn: 'root'
通知 Angular在根注入器中註冊這個效勞,這也是運用CLI天生效勞時默許的體式格局.
這類體式格局註冊,不需要再@NgModule
裝潢器中寫providers
,而且在代碼編譯打包時,能夠實行搖樹優化,會移除一切沒在運用中運用過的效勞。引薦運用此種體式格局註冊效勞.在模塊
@NgModule
中的 providers//service @Injectable() //module @NgModule({ providers: [ UserService, { provide: APP_CONFIG, useValue: HERO_DI_CONFIG } ], })
這類體式格局註冊,能夠對效勞舉行一些分外的設置(效勞類中也需要寫@Injectable()裝潢器).
在組件
@Component
中的 providers@Component({ selector: 'app-heroes', providers: [ HeroService ]
這類體式格局註冊,會註冊到每一個組件實例本身的注入器上。(多個組件會有多個注入器)
- 不供應效勞類
最常見的圖紙是class,但是在設置
providers: []
時,也能夠不供應效勞類,而是返回對象的工場函數,或是對象字面量[{ provide: Logger, useClass: Logger }]
也能夠運用useValue
屬性直接託付一個對象實例,[{ provide: Logger, useValue: silentLogger }]