我今天刚把我的应用程序换成了延迟加载的。
我有一个导出大量服务的SharedModule
。在我的AppModule
中,我导入了SharedModule
,因为AppComponent
需要访问一些共享服务。
在另一个模块FinalReturnModule
中,我导入了SharedModule
。在我的一个服务中,我在构造函数中放置了一个console.log('hi')
。
当应用程序第一次加载时,我将hi
转到控制台。每当我导航到FinalReturnModule
中的页面时,我都会再次得到hi
。显然,由于有两个实例,由于模块无法通信,因此一切都不能正常工作。
如何停止服务被实例化两次?
编辑:背景,该应用程序是使用angular-cli构建的。
当前版本:
angular-cli: 1.0.0-beta.24
node: 6.9.1
os: win32 ia32
@angular/common: 2.4.1
@angular/compiler: 2.4.1
@angular/core: 2.4.1
@angular/forms: 2.4.1
@angular/http: 2.4.1
@angular/platform-browser: 2.4.1
@angular/platform-browser-dynamic: 2.4.1
@angular/router: 3.1.1
@angular/compiler-cli: 2.4.1
发布于 2016-12-23 08:53:05
如果服务真的是一个单例(只创建一次),不要将它添加到任何将成为延迟加载模块的一部分的模块(例如,在SharedModule
中)。原因是延迟加载的模块获得了它们自己的服务实例。如果您希望服务真正成为单例,那么只需将其添加到AppModule
中,或者只导入到AppModule
中的“核心模块”中。或者,您可以使用仅在AppModule
中调用的forRoot
import { ModuleWithProviders } from '@angular/core';
@NgModule({
declarations: [...],
imports: [...]
})
class SharedModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: SharedModule,
providers: [ MySingletonService ]
}
}
}
@NgModule({
imports: [ SharedModule.forRoot() ]
})
class AppModule {}
@NgModule({
imports: [ SharedModule ]
})
class OtherModule {}
现在,AppModule
是唯一一个使用提供程序导入模块的模块。
另请参阅:
https://stackoverflow.com/questions/41290275
复制相似问题