有时,你会想要在一个角度应用程序中创建一个共享模块,它定义了模块和延迟加载的modules]可以使用的服务、管道和指令。有一个小问题是,通常应该充当单例的服务最终可能会被多次提供,特别是对于延迟加载的模块。然而,对我们来说幸运的是,通过在共享模块中定义一个静态forRoot方法来返回一个ModuleWithProviders对象,可以很容易地修复该特定用例。
以下是一个样例实现。首先,我们的共享模块:
1[label ./shared/shared.module.ts]
2import { NgModule, ModuleWithProviders } from '@angular/core';
3
4import { MyDirective } from './my.directive';
5import { FunPipe } from './fun.pipe';
6import { SomeService } from './some.service';
请注意,我们如何像往常一样在NgModule的metadata,中声明和导出管道和指令,但我们不提供该服务。相反,我们在模块的类中定义了一个静态forRoot方法,该方法返回一个实现Angel的ModuleWithProviders接口的对象。
现在,在我们的应用程序模块中,我们可以导入共享模块并在其上调用Root来提供我们的服务:
1[label app.module.ts]
2import { BrowserModule } from '@angular/platform-browser';
3import { NgModule } from '@angular/core';
4
5import { AppComponent } from './app.component';
6import { SharedModule } from './shared/shared.module';
<$>[注意]您可能已经注意到,在导入RouterModule并在应用程序模块中对其调用forRoot 时,您已经看到了这一点。<$>
最后,在任何功能模块中,我们只需导入共享模块,而无需forRoot ,即可访问共享管道和指令,而无需再次提供服务:
1[label some-feature.module.ts]
2import { NgModule } from '@angular/core';
3import { CommonModule } from '@angular/common';
4
5import { SharedModule } from '../shared/shared.module';
6// ...
🍕就是这样!这是一个巧妙的小技巧,可以让使用共享模块和延迟加载的功能模块变得更容易。