我刚刚遇到一个懒惰模块的问题,其中父和子模块都需要相同的服务,但是每个都要创建一个实例.声明对于两者都是相同的,也就是说
import { MyService } from './my.service'; ... @NgModule({ ... providers: [ MyService,... ] });
这里是路由设置
export parentRoutes: Routes = [ { path: ':id',component: ParentComponent,children: [ { path: '',component: ParentDetailsComponent },{ path: 'child',loadChildren: 'app/child.module#ChildModule' },... ]} ];
这当然是在父模块中导入的
RouterModule.forChild(parentRoutes)
如果我想分享相同的服务实例,我该怎么做?
使用forRoot,如上所述,here是您可能需要的.要解决的问题直接关系到您使用延迟加载的模块获取自己的服务遇到的问题.
这在07年在这里解释,但是该部分并没有解释关于延迟加载问题.这是在Shared Modules年底有一点警告
Do not specify app-wide singleton
providers
in a shared module. A lazy loaded module that imports that shared module will make its own copy of the service.
@NgModule({}) class SharedModule { static forRoot() { ngModule: SharedModule,providers: [ MyService ] } } @NgModule({ import: [ SharedModule.forRoot() ] }) class AppModule {} @NgModule({ imports: [ SharedModule ] }) class LazyLoadedModule {}
这样可以确保延迟加载的模块不能得到服务.但是,无论模块是否被延迟加载,这是推荐用于全面服务的模式.虽然应该注意的是,如果没有任何延迟加载的模块,不使用forRoot模式,并且只是导入SharedModule,它只会是该服务的一个实例.但是,这种模式仍然应该被推荐.
UPDATE
我想我没有完全看这个问题就快速回答.在这个问题上,没有提到任何共享模块.似乎OP只是试图将该服务添加到应用程序模块和延迟加载的子模块中的@ NgModule.providers.
在这种情况下,只需从子模块提供程序中删除该服务.不需要在应用程序模块中添加的那个就足以让孩子被使用了.
只要记住,提供程序是广泛的(除了在这个帖子是关于问题的情况),而声明不是.