Angular6的效勞和依靠注入

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 }]

    原文作者:chenqiao
    原文地址: https://segmentfault.com/a/1190000015391334
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞