2016-12-06 8 views
1

私は角に問題があります。Angular2サービスインスタンスはAUXルート間で共有されませんか?

<!-- Navigation --> 
<nav *ngIf="authService.loggedIn" id="navigation"> 
    <iq-navigation></iq-navigation> 
</nav> 

<!-- Master View --> 
<div *ngIf="authService.loggedIn" id="master" [iqResizable]="['right']" [minSize]="250"> 
    <router-outlet name="master"></router-outlet> 
</div> 

<!-- Detail View --> 
<div id="detail"> 

    <!-- Detail Header --> 
    <div id="detail-header"> 
      <router-outlet name="detail-header"></router-outlet> 
    </div> 

    <!-- Detail Main --> 
    <div id="detail-main"> 
     <router-outlet></router-outlet> 
    </div> 

    <!-- Detail Bottom --> 
    <div *ngIf="authService.loggedIn" id="detail-bottom" [iqResizable]="['top']"> 
     <router-outlet name="detail-bottom"></router-outlet> 
    </div> 

</div> 
機能モジュールのルートが に設定されている

APP-:

const routes: Routes = [ 
{ 
    path: '', 
    children: [ 
     { path: '', component: CanvasComponent }, 
     { path: '', component: ControlsComponent, outlet: 'master' }, 
     { path: '', component: ToolbarComponent, outlet: 'detail-header' }, 
     { path: '', component: ConsoleComponent, outlet: 'detail-bottom' }, 
    ] 
}]; 

コンセントがapp.component.htmlで宣言されています。私は、そのルーティングの設定次のようになります機能モジュールを持っています

const routes: Routes = [ 
{ 
    path: '', 
    redirectTo: '/flow', 
    pathMatch: 'full' 
}, 
{ 
    path: 'flow', 
    canActivate: [AuthGuard], 
    loadChildren: 'app/flow/flow.module#FlowModule' 
}, 
{ 
    path: 'data', 
    canActivate: [AuthGuard], 
    loadChildren: 'app/data-manager/data-manager.module#DataManagerModule' }, 
{ 
    path: 'login', 
    loadChildren: 'app/login/login.module#LoginModule' 
},]; 

キャンバスコンポーネントとの両方:このようなrouting.module コントロールコンポーネントはサービスを注入していますが、それぞれ独自のインスタンスを取得しています。

私は、各モジュール(特に、このフィーチャモジュールに遅延読み込みが行われるため)に独自のルートインジェクタがあり、それがルートインジェクタの子として追加されると考えました。しかし、各コンセントの各ルートコンポーネントは、独自のルートインジェクタ(各自が私のEditorServiceを提供する)を取得し、共通の祖先を共有しないため、それぞれ独自のサービスインスタンスを取得するようです。

これは意図的ですか?私の場合、これは私のアーキテクチャ全体をねじ込みます。

ご協力いただきありがとうございます。

編集:ここEditorService

遅延ロードモジュールの定義(flow.module)

@NgModule({ 
imports: [ ReactiveFormsModule, SharedModule, FlowRoutingModule ], 
exports: [], 
declarations: [ 
    CanvasComponent, 
    ControlsComponent, 
    ... 
], 
providers: [ 
    EditorService, 
    .... 
] 

})

回インスタンス化されますサービスであります

アプリモジュールの場合、何も気にしませんが、完全性のために:

@NgModule({ 
    imports: [ BrowserModule, AppRoutingModule, CoreModule, SharedModule, LoginModule ], 
    exports: [], 
    declarations: [ AppComponent ], 
    providers: [], 
    bootstrap: [ AppComponent ] 
}) 
export class AppModule { } 

マイソリューション まあギュンターにより示唆されるように、私は私のEditorServiceを提供するように構成ModuleWithProviderを返し、それが働くFlowModule.forRoot()機能を実装しました。この動作が意図されているのであれば、私はまだ不思議です。それ以上の設定手順を必要とせずに最適な機能モジュールをロードするだけなので、また、他のすべてのフィーチャモジュールとサービス(これは上記のアーキテクチャのためにマスターとディテールアウトレットのコンポーネントなど)でこれを行う必要があります。

+0

モジュールはどのように定義されていますか?完全なコードである必要はありません。 'entryComponents'、' providers'ビットだけです。 – yuxhuang

+0

こんにちは、お返事ありがとうございます。私は情報で私の質問を編集しました。 – guenne

答えて

0

私は各モジュールこのフィーチャモジュールは遅くロードされるので)独自のルートインジェクタを持ち、これがルートインジェクタの子として追加されます。しかし、各コンセントの各ルートコンポーネントがappコンポーネントに接続され、共通の祖先を共有しないため、それぞれ独自のサービスインスタンスを取得するようです。

あなたがこれによって何を意味するのか分かりにくいです。

遅延ロードされたモジュールでサービスを提供する場合、このモジュールのコンポーネントは、遅延ロードされたコンポーネントとは別のモジュールまたは非遅延ロードモジュールから異なるインスタンスを取得します。

実際には、遅延ロードされていないモジュールのコンポーネントは、アプリケーションのルートスコープにプロバイダが登録されていて、他の遅延ロードされたモジュールにインスタンスが挿入された場合にのみインスタンスを取得します。プロバイダまたはアプリケーションルートスコープにはプロバイダがあります。

+0

これは、すべての提供サービスがルートインジェクタに追加される非遅延ロードモジュールとは対照的に、遅延ロードされた各モジュールにはルートインジェクタの子として追加される独自のルートインジェクタがあることを意味します。 – guenne

+0

そうです。ただし、アプリケーションのルートスコープに** **サービスを提供する場合、遅延ロードされたモジュールのコンポーネントはグローバルインスタンスを取得します。 –

+0

ええ、最悪の場合、私はそれをしなければなりません。しかし、それは私のフィーチャー・モジュールの賛同と矛盾します。私のフローモジュールはエディタなので、エディタサービスはこのモジュール内でのみ記述し、アプリケーションモジュールでは記述しないでください。それは非常に残念です:( – guenne

関連する問題