angular中forRoot&forChild的作用

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处理不了,当我们懒加载某一个模块时,该模块上面的服务会重新注册,如果该服务已经被注册过了,就会造成应用中一个服务有多个实例的情况。

怎么能确保完全的单例呢?这个时候我们就需要借助forRootforChild了。

观察ModuleWithProviders,我们可以看到providers属性是可选的,他们的区别也是在providers上。我们可以将需要确保完全单例的服务移动到forRoot中去。在主模块中导入模块时通过forRoot方法导入,在子模块中导入模块时直接导入。这样就能确保服务只会注册一次了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章