首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Angular2延迟加载服务被实例化两次

Angular2延迟加载服务被实例化两次
EN

Stack Overflow用户
提问于 2016-12-23 03:19:13
回答 1查看 4.1K关注 0票数 11

我今天刚把我的应用程序换成了延迟加载的。

我有一个导出大量服务的SharedModule。在我的AppModule中,我导入了SharedModule,因为AppComponent需要访问一些共享服务。

在另一个模块FinalReturnModule中,我导入了SharedModule。在我的一个服务中,我在构造函数中放置了一个console.log('hi')

当应用程序第一次加载时,我将hi转到控制台。每当我导航到FinalReturnModule中的页面时,我都会再次得到hi。显然,由于有两个实例,由于模块无法通信,因此一切都不能正常工作。

如何停止服务被实例化两次?

编辑:背景,该应用程序是使用angular-cli构建的。

当前版本:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-23 08:53:05

如果服务真的是一个单例(只创建一次),不要将它添加到任何将成为延迟加载模块的一部分的模块(例如,在SharedModule中)。原因是延迟加载的模块获得了它们自己的服务实例。如果您希望服务真正成为单例,那么只需将其添加到AppModule中,或者只导入到AppModule中的“核心模块”中。或者,您可以使用仅在AppModule中调用的forRoot

代码语言:javascript
复制
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是唯一一个使用提供程序导入模块的模块。

另请参阅:

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41290275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档