最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

angular 服務隨記小結

 更新時間:2019年05月06日 11:08:57   作者:aishuishui2066  
這篇文章主要介紹了angular 服務隨記小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

依賴注入

創(chuàng)建服務需要用到Injectable,@Injectable() 裝飾器把類標記為可供注入的服務,不過在使用該服務的 provider 配置好 Angular 的依賴注入器之前,Angular 實際上無法將其注入到任何位置。

provider告訴注入器如何創(chuàng)建該服務,可以通過設置元數(shù)據(jù)來配置注入器(3種方式):

  • 在服務本身的 @Injectable() 裝飾器中。
  • 在 NgModule 的 @NgModule() 裝飾器中。
  • 在組件的 @Component() 裝飾器中。

@Injectable() 裝飾器具有一個名叫 providedIn 的元數(shù)據(jù)選項,在這里指定把被裝飾類的provider放到 root 注入器中,或某個特定 NgModule 的注入器中。

@NgModule() 和 @Component() 裝飾器都有用一個 providers 元數(shù)據(jù)選項,在那里你可以配置 NgModule 級或組件級的注入器。

注入器與服務實例

在某個注入器范圍內(nèi),服務是單例的。應用只有一個根注入器,angular具有多級注入器系統(tǒng),以為者下級注入器可以創(chuàng)建自己的服務實例。

每當 Angular 創(chuàng)建一個在 @Component() 中指定了 providers 的組件實例時,它也會為該實例創(chuàng)建一個新的子注入器。 類似的,當在運行期間加載一個新的 NgModule 時(即lazy module),Angular 也可以為它創(chuàng)建一個擁有自己的提供商的注入器。

借助注入器繼承機制,仍然可以把全應用級的服務注入到這些組件中。 組件的注入器是其父組件注入器的子節(jié)點,也是其父節(jié)點的父節(jié)點的后代,以此類推,直到應用的根注入器為止。 Angular 可以注入該繼承譜系中任何一個注入器提供的服務。

模塊化編程時,service、component、pipe等最好都放在module中,需要引入這些服務時,通過導入module來引用,不要直接import service 和component,這不符合模塊化思想。

多級注入系統(tǒng)

應用程序中有一個與組件樹平行的注入器樹,對于在什么級別上注入會最終導致:

  • 最終包的大小
  • 服務的范圍
  • 服務的生命周期

當在服務自身的@Injectable()裝飾器中指定provider時,CLI生產(chǎn)模式所用的優(yōu)化工具可以進行搖樹優(yōu)化,它會移除那些沒有用過的服務,搖樹優(yōu)化生成的包更小。

三級provider

  • root級,是AppModule全局的,配置方法已提。
  • NgModule級,兩種方法:可以在module的@NgModule 的 provider 元數(shù)據(jù)中指定;也可以在@injectable() 的providerIn選項中指定某個模塊類

如果模塊是lazy modole,需要使用@NgModule的provider選項。

  • 組件級為每個component實例配置自己的注入器

無論對于根級注入器還是模塊級注入器,服務實例的生存期都和應用或模塊本身相同。Angular 可以把這個服務實例注入到任何需要它的類中(即app內(nèi)是單例的)。Angular 只能把相應的服務注入到該組件實例或其下級組件實例中,而不能把這個服務實例注入到其它地方(即組件內(nèi)并不是單例的)。

注入器冒泡

當一個組件申請獲得一個依賴時,Angular 先嘗試用該組件自己的注入器來滿足它。 如果該組件的注入器沒有找到對應的提供商,它就把這個申請轉給它父組件的注入器來處理。 如果那個注入器也無法滿足這個申請,它就繼續(xù)轉給它在注入器樹中的父注入器。 這個申請繼續(xù)往上冒泡 —— 直到 Angular 找到一個能處理此申請的注入器或者超出了組件樹中的祖先位置為止。 如果超出了組件樹中的祖先還未找到,Angular 就會拋出一個錯誤。

單例服務

在angular中創(chuàng)建單例服務有兩種方式:

  • 在創(chuàng)建服務時聲明該服務在應用的根上提供
  • 把該服務包含在AppModule或者某個只會被AppModule導入的模塊中

這里第一條很容易理解。重點第二條:當通過@NgMododule()來聲明一個serivce時,這個服務在AppModule內(nèi)將會是單例的,當一個module中提供了一個service,當另一個lazy module導入了這個模塊時,angular會為它創(chuàng)一個子注入器,會重新創(chuàng)建service的實例,此service也就多了一個實例。

forRoot()

如果某個模塊同時提供了服務提供商和可聲明對象(組件、指令、管道),那么當在某個子注入器中加載它的時候(比如lazy module),就會生成多個該服務提供商的實例。 而存在多個實例會導致一些問題,因為這些實例會屏蔽掉根注入器中該服務提供商的實例,而它的本意可能是作為單例對象使用的。 因此,Angular 提供了一種方式來把服務提供商從該模塊中分離出來,以便該模塊既可以帶著 providers 被根模塊導入,也可以不帶 providers 被子模塊導入。

如上文所述,當在運行期間加載一個新的 NgModule 時(即lazy module),Angular 也可以為它創(chuàng)建一個注入器,所以此時導入的其他模塊中的service就生成了多個實例,而forRoot可以保證并不創(chuàng)建新的service實例,而是去引用root注入器中的service實例,也就保證了service依然是個單例服務。

Code

在懶加載模塊中導入有service的TestDIModule模塊

@NgModule({
 imports: [
 CommonModule,
 BatteryRoutingModule,
 TestDIModule
 ],
 declarations: [BatteryWidgetComponent, BatteryTwoComponent,
 DemoComponent]
})

在TestDIModule模塊中

@NgModule({
 imports: [
 CommonModule
 ],
 declarations: [TestDiComponent],
 exports: [TestDiComponent],
 providers: [ ]
})
export class TestDIModule {
 static forRoot(): ModuleWithProviders {
 return {
  ngModule: TestDIModule,
  providers: [
  TestDiService
  ]
 };
 }
 }

在根模塊中引入TestDIModule模塊

imports: [
 BrowserModule,
 TestDIModule.forRoot(),
 ],

最后在根模塊路由中添加這個懶加載模塊

const routes: Routes = [
 { path: 'battery', loadChildren: './battery-widget/battery.widget.module#BatteryWidgetModule' },
];

@NgModule({
 exports: [ RouterModule ],
 imports: [ RouterModule.forRoot(routes)
 ],
})

作為測試,可以在TestDIModule中的service中打log看一下

import { Injectable, ModuleWithProviders } from '@angular/core';
import { TestDIModule } from './test-di.module'

@Injectable()
export class TestDiService {

 constructor() {
 console.log('->TestDiService');
 }

 addCoount() {
 this.count++;
 console.log('->count', this.count);
 }

 count = 0;
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Angular實現(xiàn)可刪除并計算總金額的購物車功能示例

    Angular實現(xiàn)可刪除并計算總金額的購物車功能示例

    這篇文章主要介紹了Angular實現(xiàn)可刪除并計算總金額的購物車功能,涉及AngularJS事件響應、元素遍歷與數(shù)值運算等相關操作技巧,需要的朋友可以參考下
    2017-12-12
  • Angular?項目路徑添加指定的訪問前綴

    Angular?項目路徑添加指定的訪問前綴

    這篇文章主要為大家介紹了Angular?項目路徑添加指定的訪問前綴方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Angularjs 制作購物車功能實例代碼

    Angularjs 制作購物車功能實例代碼

    這篇文章主要介紹了Angularjs 制作購物車功能實例代碼的相關資料,并附示例代碼,需要的朋友可以參考下
    2016-09-09
  • AngularJS表達式講解及示例代碼

    AngularJS表達式講解及示例代碼

    本文主要講解AngularJS表達式,這里整理了相關資料和提供示例代碼以及實現(xiàn)效果圖,有需要的小伙伴可以參考下
    2016-08-08
  • angular.js分頁代碼的實例

    angular.js分頁代碼的實例

    本文用實例詳細給大家展示了angular.js分頁代碼,代碼很詳細,感興趣的小伙伴們可以參考一下
    2016-07-07
  • AngularJS 使用ng-repeat報錯 [ngRepeat:dupes]

    AngularJS 使用ng-repeat報錯 [ngRepeat:dupes]

    這篇文章主要介紹了AngularJS 使用ng-repeat報錯 [ngRepeat:dupes] 的相關資料,需要的朋友可以參考下
    2017-01-01
  • AngularJS 簡單應用實例

    AngularJS 簡單應用實例

    本文主要介紹AngularJS 的簡單應用實例,這里對AngularJS的知識總結,并提供實例代碼和應用程序講解,有需要的小伙伴可以參考下
    2016-07-07
  • Angular2之二級路由詳解

    Angular2之二級路由詳解

    今天小編就為大家分享一篇Angular2之二級路由詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • 在?Angular?中獲取當前日期的方法

    在?Angular?中獲取當前日期的方法

    我們將通過示例介紹一種在 Angular 應用程序中獲取當前日期的簡單方法,我們還將解決如何更改 Angular 中的日期格式,對在Angular中獲取當前日期感興趣的朋友跟隨小編一起看看吧
    2023-05-05
  • angular項目中bootstrap-datetimepicker時間插件的使用示例

    angular項目中bootstrap-datetimepicker時間插件的使用示例

    這篇文章主要介紹了angular項目中bootstrap-datetimepicker時間插件的使用示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03

最新評論

遵义市| 汝城县| 平乐县| 蛟河市| 多伦县| 克拉玛依市| 大连市| 靖远县| 铜鼓县| 嵊州市| 新龙县| 浮梁县| 临夏县| 化德县| 大洼县| 舞钢市| 东兰县| 金昌市| 双城市| 全椒县| 金寨县| 安顺市| 西和县| 和平县| 金门县| 龙岩市| 韶山市| 平安县| 湟源县| 博爱县| 英超| 焦作市| 平安县| 周宁县| 措美县| 绵阳市| 井研县| 积石山| 兴安县| 大理市| 中牟县|