深入理解Angular4中的依賴注入
在Angular中使用依賴注入,可以幫助我們實現(xiàn)松耦合,可以說只有在組件中使用依賴注入才能真正的實現(xiàn)可重用的組件。
如果我們有個服務(wù)product.service.ts,其中export了一個ProductService類,類中有一個getProduct方法。
如果不使用依賴注入,假設(shè)我們需要在product組件中使用這個服務(wù)時就會new一個ProductService類,但如果這個組件被用到了另一個地方,需要的服務(wù)改變了,我們就不得不更改組件中的內(nèi)容,這樣的組件不能說是可復(fù)用的。
一、注入器
Angular中的注入器只有一種實現(xiàn)方法就是在構(gòu)造函數(shù)中聲明。
例如在一個組件中
constructor(productService: ProductService){}
通俗的講這段代碼的意思就是說,這個組件創(chuàng)建了一個productService,而這個productService是依賴ProductService的,這里的ProductService只是一個token,至于ProductService 是什么,是怎么實現(xiàn)的,全都是由提供器說明的。
二、提供器
通常提供器定義在應(yīng)用級,及app.module.ts中,供所有組件或服務(wù)使用,當(dāng)然也可以定義在某一個組件中,只供這一個組件使用。
我們以定義在應(yīng)用級為例:
@NgModule({ provides:[ProductService] })
這段代碼其實這一個簡寫,全寫為:
@NgModule({ provides:[{ provide: ProductService, useClass:ProductService }] })
這段代碼中的provide聲明的就是我們剛剛在注入器中提過的token,就是說這兩個token是一一對應(yīng)的,Angular會到提供器中找到和注入器相同的token.
代碼中的useClass是實例化ProductService類,及我們幫助我們new 了一個類出來。除了useClass外,比較常用的還用useFactory,使用工廠模式實例化一個類。
這時候我們在組件中就可以直接使用ProductService類中的方法了。
當(dāng)token和想要實例化的類名字相同時,我們就可以使用上面那種簡寫的方法。
說了這么多,那到底怎么才能體現(xiàn)出可復(fù)用性呢?
如果現(xiàn)在我們的product組件用到了另一個地方需要使用另一個服務(wù),我們命名為AnotherProductService。有了依賴注入我們就不必要更改組件,而是更改app.module.ts中的提供器:
@NgModule({ provide: ProductService, useClass: AnotherProductService })
從這段代碼可以看出,token并沒有改變,可是這是實例化的類變?yōu)榱薃notherProductService。
總結(jié)來說,當(dāng)組件在構(gòu)造函數(shù)中說明自己想要依賴一個類時,Angular首先會在這個組件自身找有沒有提供器,如果沒有就去這個組件的父組件中找,如果也沒有找到就去應(yīng)用級(app.module.ts)中找。找到后,就會按照提供器可說明的為組件注入它想要的。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Angular2-primeNG文件上傳模塊FileUpload使用詳解
這篇文章主要為大家詳細(xì)介紹了Angular2-primeNG文件上傳模塊FileUpload使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01Angular2仿照微信UI實現(xiàn)9張圖片上傳和預(yù)覽的示例代碼
本篇文章主要介紹了Angular2仿照微信UI實現(xiàn)9張圖片上傳和預(yù)覽的示例代碼,非常具有實用價值,需要的朋友可以參考下2017-10-10詳解Angular中通過$location獲取地址欄的參數(shù)
這篇文章主要介紹了詳解 Angular中通過$location獲取地址欄的參數(shù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08Angularjs通過指令監(jiān)聽ng-repeat渲染完成后執(zhí)行腳本的方法
指令是angular的核心功能之一,用好了事半功倍,監(jiān)聽ng-repeat執(zhí)行狀態(tài)僅僅是它功能的冰山一角吧。下面這篇文章主要介紹了Angularjs通過指令監(jiān)聽ng-repeat渲染完成后執(zhí)行腳本的方法,需要的朋友可以參考下。2016-12-12Angular.js中window.onload(),$(document).ready()的寫法淺析
這篇文章主要介紹了Angular.js中window.onload(),$(document).ready()的寫法淺析,需要的朋友可以參考下2017-09-09Angular.js指令學(xué)習(xí)中一些重要屬性的用法教程
這篇文章主要給大家介紹了關(guān)于Angular.js指令學(xué)習(xí)中一些重要屬性的用法教程,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-05-05