11

我今天刚刚将我的应用程序切换为延迟加载。
我有一个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
4

1 回答 1

20

如果该服务确实是一个单例(一个创建一次),不要将它添加到任何将成为延迟加载模块的一部分的模块中(例如在SharedModule. 原因是延迟加载模块获得了自己的服务实例。如果您希望服务真正成为单例,则将其添加到AppModule. 或仅导入到AppModule. 或者你可以使用forRootwhich 只会在AppModule

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是唯一一个使用提供者导入模块的模块。

也可以看看:

于 2016-12-23T00:53:05.320 回答