4

私は今、自分のアプリケーションを遅れてロードするように切り替えました。
私はSharedModuleを持っており、一連のサービスをエクスポートしています。 私のAppModuleではAppComponentがいくつかの共有サービスにアクセスする必要があるため、SharedModuleをインポートします。Angular2レイジーローディングサービスが2回インスタンス化されました

別のモジュールFinalReturnModuleでは、私はSharedModuleをインポートします。私のサービスの1つでは、console.log('hi')をコンストラクタに入れました。

アプリが最初に読み込まれると、コンソールにhiが届きます。 FinalReturnModuleのページに移動すると、いつでもhiが返ってきます。明らかに、2つのインスタンスがあるため、モジュールが通信できないため、正しく動作するものはありません。

サービスのインスタンス化を2回中止するにはどうすればよいですか?

編集:バックグラウンド、アプリは、角度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

サービスが本当にシングルトン(一度作成したもの)であることを意味している場合は、レイジーロードされたモジュールの一部となる任意のモジュールに追加しないでください(例えばSharedModule)。その理由は、遅延ロードされたモジュールが自身のサービスインスタンスを取得するためです。サービスを本当にシングルトンにしたい場合は、AppModule、またはAppModuleにのみインポートされる「コアモジュール」に追加してください。それとも、今だけAppModuleは、プロバイダとモジュールをインポートモジュールだけです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 {} 

に呼び出されますforRootを使用することができます。

関連項目:

  • Docs on Modules。これらすべてのものがそこに説明されています。
関連する問題