深入理解Angular4中的依賴(lài)注入
在Angular中使用依賴(lài)注入,可以幫助我們實(shí)現(xiàn)松耦合,可以說(shuō)只有在組件中使用依賴(lài)注入才能真正的實(shí)現(xiàn)可重用的組件。
如果我們有個(gè)服務(wù)product.service.ts,其中export了一個(gè)ProductService類(lèi),類(lèi)中有一個(gè)getProduct方法。
如果不使用依賴(lài)注入,假設(shè)我們需要在product組件中使用這個(gè)服務(wù)時(shí)就會(huì)new一個(gè)ProductService類(lèi),但如果這個(gè)組件被用到了另一個(gè)地方,需要的服務(wù)改變了,我們就不得不更改組件中的內(nèi)容,這樣的組件不能說(shuō)是可復(fù)用的。
一、注入器
Angular中的注入器只有一種實(shí)現(xiàn)方法就是在構(gòu)造函數(shù)中聲明。
例如在一個(gè)組件中
constructor(productService: ProductService){}
通俗的講這段代碼的意思就是說(shuō),這個(gè)組件創(chuàng)建了一個(gè)productService,而這個(gè)productService是依賴(lài)ProductService的,這里的ProductService只是一個(gè)token,至于ProductService 是什么,是怎么實(shí)現(xiàn)的,全都是由提供器說(shuō)明的。
二、提供器
通常提供器定義在應(yīng)用級(jí),及app.module.ts中,供所有組件或服務(wù)使用,當(dāng)然也可以定義在某一個(gè)組件中,只供這一個(gè)組件使用。
我們以定義在應(yīng)用級(jí)為例:
@NgModule({
provides:[ProductService]
})
這段代碼其實(shí)這一個(gè)簡(jiǎn)寫(xiě),全寫(xiě)為:
@NgModule({
provides:[{
provide: ProductService,
useClass:ProductService
}]
})
這段代碼中的provide聲明的就是我們剛剛在注入器中提過(guò)的token,就是說(shuō)這兩個(gè)token是一一對(duì)應(yīng)的,Angular會(huì)到提供器中找到和注入器相同的token.
代碼中的useClass是實(shí)例化ProductService類(lèi),及我們幫助我們new 了一個(gè)類(lèi)出來(lái)。除了useClass外,比較常用的還用useFactory,使用工廠模式實(shí)例化一個(gè)類(lèi)。
這時(shí)候我們?cè)诮M件中就可以直接使用ProductService類(lèi)中的方法了。
當(dāng)token和想要實(shí)例化的類(lèi)名字相同時(shí),我們就可以使用上面那種簡(jiǎn)寫(xiě)的方法。
說(shuō)了這么多,那到底怎么才能體現(xiàn)出可復(fù)用性呢?
如果現(xiàn)在我們的product組件用到了另一個(gè)地方需要使用另一個(gè)服務(wù),我們命名為AnotherProductService。有了依賴(lài)注入我們就不必要更改組件,而是更改app.module.ts中的提供器:
@NgModule({
provide: ProductService,
useClass: AnotherProductService
})
從這段代碼可以看出,token并沒(méi)有改變,可是這是實(shí)例化的類(lèi)變?yōu)榱薃notherProductService。
總結(jié)來(lái)說(shuō),當(dāng)組件在構(gòu)造函數(shù)中說(shuō)明自己想要依賴(lài)一個(gè)類(lèi)時(shí),Angular首先會(huì)在這個(gè)組件自身找有沒(méi)有提供器,如果沒(méi)有就去這個(gè)組件的父組件中找,如果也沒(méi)有找到就去應(yīng)用級(jí)(app.module.ts)中找。找到后,就會(huì)按照提供器可說(shuō)明的為組件注入它想要的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Angular5中提取公共組件之radio list的實(shí)例代碼
這篇文章主要介紹了Angular5中提取公共組件之radio list的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
AngularJS教程之簡(jiǎn)單應(yīng)用程序示例
本文主要介紹AngularJS簡(jiǎn)單應(yīng)用程序,這里提供了詳細(xì)的流程和代碼程序,有需要的小伙伴可以參考下2016-08-08
解決angular雙向綁定無(wú)效果,ng-model不能正常顯示的問(wèn)題
今天小編就為大家分享一篇解決angular雙向綁定無(wú)效果,ng-model不能正常顯示的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
Angularjs 動(dòng)態(tài)改變title標(biāo)題(兼容ios)
這篇文章主要介紹了 Angularjs 動(dòng)態(tài)改變title標(biāo)題(兼容ios)的相關(guān)資料,需要的朋友可以參考下2016-12-12
AngularJs 最新驗(yàn)證手機(jī)號(hào)碼的實(shí)例,成功測(cè)試通過(guò)
下面小編就為大家分享一篇AngularJs 最新驗(yàn)證手機(jī)號(hào)碼的實(shí)例,成功測(cè)試通過(guò),具有很好的參考價(jià)值。希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
詳解angular臟檢查原理及偽代碼實(shí)現(xiàn)
這篇文章主要介紹了詳解angular臟檢查原理及偽代碼實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06

