2016-08-11 15 views
0

ルート間で共通のオブジェクトを渡す方法の解答を探しています。角2ルート間のオブジェクトの受け渡し

は私が発するために聞くことができるようにsocket.io

は私が私のサイト全体にわたるそのソケットサービスへのアクセスを持っている必要があります保存するサービスを提供しています。

私はroute.tsファイルを持っています。ルートでソケットサービスを初期化し、必要に応じてルートにパスする方法がわかりません。

私は、ドキュメントを読んでいると私は私のroute.tsファイルに以下のようなデータを使用しようとしています:

const routes: RouterConfig = [ 

    { path: '', component: AppComponent }, 
    { path: 'function1', component: Function1Component, data: { socket: socket }}, 
]; 

は、しかし、私はソケットサービスを宣言する場所を知りません。あなたは、ルートのdataオプションから(オブジェクト/約束/観測可能に返すために起こっている)、いくつかの機能のリファレンスを渡ししようとしているので、それがためdataオプションでそれを渡すことによって動作しないでしょう、あなたの場合は

おかげ

+0

サービスを作成したいと思うような音です。あなたのブートストラップでそれを提供するならば、同じインスタンスは、型を使ってコンストラクタパラメータを作るだけで、どのコンポーネントでも利用できます。 [私の質問](http://stackoverflow.com/questions/36198785/how-do-i-create-a-singleton-service-in-angular-2)を見てください –

答えて

1

this.routerData.get('socket')を実行してデータを要求すると、データを文字列化します。

resolveオプションを使用することを強くお勧めします。 resolve方法は、あなたがこの中には、ルーティング関与してはならないpromise/observable

コード

@Injectable() 
class SocketResolver implements Resolve { 
    constructor(private socketService: socketService) {} 
    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<any> { 
    return this.socketService.connection(); 
    } 
} 

const routes: RouterConfig = [ 
    { path: '', component: AppComponent }, 
    { path: 'function1', component: Function1Component, 
     resolve: { socket: SocketResolver } 
    } 
]; 

Doc Link

0

を返します。 だけでサービスを作成します。https://angular.io/docs/ts/latest/tutorial/toh-pt4.html

SocketService.ts

import { Injectable } from '@angular/core'; 

@Injectable() 
export class SocketService { 
    ... 
} 

、コンストラクタを介して、あなたのコンポーネントまたは他のサービスでそのサービスを挿入:

constructor(private socketService:SocketService) { } 

プラス、あなたのサービスがintializedされていることを確認しますブートストラッププロセスでは:

bootstrap(AppComponent, [ 
    SocketService, 
    ... ]); 

は、コンストラクタ内にあるすべてのコンポーネントに注入されるサービスの単一のインスタンスを作成します。したがって、必要なあらゆる場所から同じソケットサービスにアクセスできます。

+0

これはうまくいくように聞こえる、どのように別のルートから別のルートコンポーネント内の変数を編集したい場合 – tony

+0

また、一部のサービスは一部のルートにのみロードする必要があり、すべてをロードする必要がない場合はどうなりますか。もし私がそれをブートストラップすれば、サービスが必要ないルート上のメモリを使い果たしますか? – tony

+0

このサービスはアプリ全体のアプリケーションメモリに保存されます。 問題は、いつでも開いているソケットをしたい場合は、それが必要です。 もしあなたがいないなら、@ Componentアノテーションの[SocketService]を介して、必要なコンポーネントにのみサービスを注入することができます。これはあなたのソケットサービスの新しいインスタンスを常に引き起こすことに注意してください。 –

関連する問題