Angular forRoot 方法的使用场合介绍

简介: Angular forRoot 方法的使用场合介绍

forRoot() 方法返回一个 NgModule 及其提供者 Providers 依赖项。


NgModule forRoot() 约定对 Angular 初学者来说是一个奇怪的约定:命名说明了如何使用它,但没有说明这样做的使用场景,即为什么需要以这种方式导入 NgModule。


一言以蔽之,forRoot 同单例服务相关。当 Angular 服务在某个时间点被加载到页面时,所有应用程序里对该服务的注入,都使用这唯一的一个实例。


延迟加载的模块可能会尝试创建该注入服务的第二个实例,而 forRoot() 方法是一种确保应用程序模块/共享模块/和任何延迟加载的模块都使用相同的 1 个实例(根实例),从而达成了服务的单例效果。


在本文的示例中,我们共享一个服务,以同步计数器值。 每当应用里的任何 Component,增加存储在计数器服务中的值时,我们都期望这个计数器的值更新行为,能够被所有组件都感知到。


以上的场景在我们引入延时加载的 NgModule 时会遇到挑战。被延迟加载的组件将无法共享相同的计数器值。 下面的例子仅仅在采取 eager 加载的组件场景中才能正常工作。


仅使用预先加载的组件时,如果您使用共享服务,则下面的示例将起作用,但请注意延迟加载的组件的行为方式。被延迟加载的组件,将获得单独的 service 实例。

import { NgModule } from '@angular/core';
import { CounterService } from './counter.service';
@NgModule({
  providers: [CounterService],
})
export class SharedModule {}


请看我的 StackBlitz 工程。

解决方案:在 SharedModule 里,开发一个 forRoot 方法:

import { NgModule,ModuleWithProviders  } from '@angular/core';
import { CounterService } from './counter.service';
@NgModule({
})
export class SharedModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: SharedModule,
      providers: [ CounterService ]
    }
  }
}


然后在 AppModule 里调用这个 forRoot 方法:

import { NgModule } from '@angular/core';
import { BrowserModule  } from '@angular/platform-browser';
import { SharedModule } from './shared/shared.module';
import { AppComponent } from './app.component';
import { EagerComponent } from './eager.component';
import { routing } from './app.routing';
@NgModule({
  imports: [
    BrowserModule,
    SharedModule.forRoot(),
    routing
  ],
  declarations: [
    AppComponent,
    EagerComponent
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}


现在,计数器服务在 Eager Loaded 模块和延迟加载模块之间能够共享。

相关文章
|
2月前
|
编译器 API 开发者
Angular Component ɵcmp 属性的含义和使用场合介绍
Angular Component ɵcmp 属性的含义和使用场合介绍
|
2月前
|
开发者
Angular UntypedFormControl markAsDirty 方法的用途介绍
Angular UntypedFormControl markAsDirty 方法的用途介绍
|
2月前
|
前端开发
Angular module 的 forRoot 和 forChild 方法
Angular module 的 forRoot 和 forChild 方法
|
9月前
|
缓存 资源调度 UED
Angular 应用构建完成后 vendor.js 文件的使用场合
Angular 应用构建完成后 vendor.js 文件的使用场合
|
2月前
快速创建Angular组件并定义传参、绑定自定义事件的方法
快速创建Angular组件并定义传参、绑定自定义事件的方法
|
2月前
Angular父组件调用子组件里面的方法
Angular父组件调用子组件里面的方法
|
8月前
|
开发者
Angular 两种依赖注入的实现方法介绍
Angular 两种依赖注入的实现方法介绍
|
9月前
|
监控 前端开发 JavaScript
dynamic import 在 Angular 应用中的使用场合讲解
dynamic import 在 Angular 应用中的使用场合讲解
|
9月前
|
缓存 前端开发 JavaScript
Commands and Queries 在 Angular 应用开发中的使用场合
Commands and Queries 在 Angular 应用开发中的使用场合
|
10月前
从 Angular Component 和 Directive 的实例化,谈谈 Angular forRoot 方法的命令由来
同 Angular service 的单例特性不同,Angular 组件和指令通常会被多次实例化,比如 HTML markup 中每出现一次 Component 的 selector,就会触发 Component 的一次实例化。