为什么我们需要用角度的forRoot()方法

时间:2018-10-04 19:31:25

标签: angular angular2-routing

angular中使用了forRoot()方法。在ngModule下,我们将其用于Root()方法,例如RouterModule.forRoot(routes)。是否需要对所有导入数组中使用的forRoot()使用此forRoot()方法?

1 个答案:

答案 0 :(得分:0)

放置在模块providers数组中的所有内容都将成为一个单例实例,该实例可在整个应用程序中使用。有些模块既需要由应用程序使用(应该创建单例),也需要同时由内部非应用程序模块使用(不应该创建单例,但是可能仍需要依赖于不是单例的声明/导出)。 forRoot背后的想法是创建单例,因此您只想在“根”模块中使用一次。

以下是当前来源的定义:

  static forRoot(routes: Routes, config?: ExtraOptions): ModuleWithProviders<RouterModule> {
    return {
      ngModule: RouterModule,
      providers: [
        ROUTER_PROVIDERS,
        provideRoutes(routes),
        {
          provide: ROUTER_FORROOT_GUARD,
          useFactory: provideForRootGuard,
          deps: [[Router, new Optional(), new SkipSelf()]]
        },
        {provide: ROUTER_CONFIGURATION, useValue: config ? config : {}},
        {
          provide: LocationStrategy,
          useFactory: provideLocationStrategy,
          deps: [
            PlatformLocation, [new Inject(APP_BASE_HREF), new Optional()], ROUTER_CONFIGURATION
          ]
        },
        {
          provide: RouterScroller,
          useFactory: createRouterScroller,
          deps: [Router, ViewportScroller, ROUTER_CONFIGURATION]
        },
        {
          provide: PreloadingStrategy,
          useExisting: config && config.preloadingStrategy ? config.preloadingStrategy :
                                                             NoPreloading
        },
        {provide: NgProbeToken, multi: true, useFactory: routerNgProbeToken},
        provideRouterInitializer(),
      ],
    };
  }

它的作用是RouterModule,并通过添加一堆其他提供的服务来扩展它。这些附加服务仅应在应用程序中实例化一次,因为它们的状态需要在整个应用程序之间共享。