Angular 2懒加载模块-服务不是单例

3
我已经在我的应用程序中实现了惰性加载模块,app.module.ts被正确配置。
@NgModule({
  declarations: [
    AppComponent,
    HeaderComponent,
    HomeComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    routing
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

路由配置
const APP_ROUTES: Routes = [
  { path: '', component: HomeComponent },
  { path: 'tools', loadChildren: 'app/tools/tools.module#ToolsModule' }
];

export const routing = RouterModule.forRoot(APP_ROUTES);

通过子模块中的提供程序字段提供服务,并在该模块的组件之间进行切换会重新实例化该服务(通过记录服务构造函数进行测试)。
该服务仅在模块中提供。
@NgModule({
  declarations: [
    ToolsComponent,
    ToolsCartComponent,
    ToolsContainerComponent,
    ToolsFormComponent
  ],
  imports: [
    CommonModule,
    toolsRouting
  ],
  providers: [ToolsService]
})
export class ToolsModule { }

为什么提供的服务不是单例模式?
编辑:
我修改了一个Plunker示例,添加了一个仅在该模块范围内(在此情况下为后端模块)使用的服务。在BackendComponent和BackendSecondComponent之间切换(两者都在惰性加载的模块中声明),服务会被重新实例化(在控制台中可见)。 Plunker链接

1
遇到了同样的问题,我认为这是因为在惰性加载模块时没有调用.forRoot()方法...我正在寻找类似的解决方案,但我需要我的服务是单例.. .. .干杯 - Spock
1
遇到了类似的问题。每次我打开与惰性加载模块关联的路由时,都会创建一个新的服务,尽管服务提供者是在模块级别上定义的。 - mrh
我相信你已经知道了这个解决方法(将服务提供给应用程序模块)。工作的 plunker: https://plnkr.co/edit/UnxciqNLfL80BotWsYri?p=preview。需要注意的一点是,文档中的警告信息是:[Angular2 模块文档链接](https://angular.io/docs/ts/latest/guide/ngmodule.html#!#why-_userservice_-isn-t-shared)。文档中指出:“不要在共享模块中指定应用程序级别的单例提供者。导入该共享模块的惰性加载模块将创建自己的服务副本。”这与此有关,但我不知道核心原因是什么。 - eko
2个回答

0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接