angular中forRoot&forChild的作用
用法
import { NgModule, ModuleWithProviders } from '@angular/core';
import { CommonModule } from '@angular/common';
@NgModule({
declarations: [],
imports: [
CommonModule
]
})
export class ChildModule {
static forChild(): ModuleWithProviders {
return {
ngModule: ChildModule,
providers: []
}
}
}
爲什麼
在angular
中,對於一些公共的組件,指令,管道,當我們需要在某個模塊中使用時,我們就需要在該模塊中導入一次。
當我們導入XXXModule
時,angular
會爲我們註冊該模塊上面的所有服務,如果我們在多個模塊中導入了XXXModule
模塊,XXXModule
模塊上面的服務是不會重複註冊的,因爲angular
會確保服務都是單例的,也就是說一個應用裏只會有一個該服務的實例。這能確保我們用服務共享數據時,不同模塊取到的數據是一致的。
但有一種情況angular
處理不了,當我們懶加載某一個模塊時,該模塊上面的服務會重新註冊,如果該服務已經被註冊過了,就會造成應用中一個服務有多個實例的情況。
怎麼能確保完全的單例呢?這個時候我們就需要藉助forRoot
和forChild
了。
觀察ModuleWithProviders
,我們可以看到providers
屬性是可選的,他們的區別也是在providers
上。我們可以將需要確保完全單例的服務移動到forRoot
中去。在主模塊中導入模塊時通過forRoot
方法導入,在子模塊中導入模塊時直接導入。這樣就能確保服務只會註冊一次了。