2017-05-03 21 views
1

私はルーティングされた角度4アプリケーションを持っています。これは、このようなネストされたルートのシリーズがあります:Routingを使用してAngular 2アプリケーションでデータを共有するにはどうすればよいですか?

const routes: Routes = [ 
    { path: "genes/:id", component: GenePageComponent, children: [ 
    { path: "mutations/:mutationType", component: MutationPageComponent }, 
    ]}, 

これは、idが123であるとmutationTypeは「非コード」されるように、私は、/genes/123/mutations/non-codingを訪問することができます。

私はActivatedRouteを注入した場合、私は断片のみためurlまたはparamsが、を購読することができます。つまり、MutationPageComponentにはmutationTypeしか見ることができません。

<router-outlet>が送信できない場合、このmutationTypeパラメータを他の上位コンポーネント(たとえば、サイドバー、検索バー、その他の最上位コンポーネント)と共有するにはどうすればよいですか?

同様に、をGenePageComponentから子供MutationPageComponentに渡すにはどうすればよいですか?

+0

現在のルートから親と子のセグメントのparamsを取得したり、グローバルのparamsを使用可能にするには、共有サービスを使用することができます。 –

+0

共有サービスは、おそらく私がやってしまうことでしょう。子どものセグメントを歩き回ることは壊れやすいようです。この事件に対処するために何かが組み込まれているはずです。 – superluminary

答えて

1

あなたがして、親コンポーネントのルートのparamsにアクセスすることができます。

this.route.parent.params.subscribe(params => ....); 

あなたはまた、各コンポーネントのアップデート、それは他の人が購読するためのサービスで価値の共有サービスを行うことができます。基本的な例は次のようになります。

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

import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 


@Injectable() 
export class SharedService { 

    private _sharedDataSource = new BehaviorSubject<MyModel>(<MyModel>{}); 
    sharedData$ = this._sharedDataSource.asObservable(); 

    constructor() { } 

    updateSharedData(data: MyModel) { 
    this._sharedDataSource.next(data); 
    } 

} 

BehaviorSubjectはデフォルト値をとり、観測可能で、常に値を発することを確認してください。コンポーネントでは、updateSharedData関数を呼び出してデータを更新し、sharedData$に登録すると、何かが変更されたときに更新された値を取得できます。

希望に役立ちます。

+0

これは私が見た1つの選択肢です。 '.parent.parent.parent'を呼び出すという考えは私の歯を端に置く。壊れやすいです。コンポーネントを上下に動かすとすべてが壊れます。また、親からの子供のパラメータや子からの親のパラメータを購読することはできないので、親のパラメータが変更された場合、子供は知らないでしょう。 – superluminary

+0

その場合、コンポーネント間でデータを共有するために共有サービスを使用する必要があると思います。階層内の各レベルのコンポーネントは、共有サービスのparam値を更新する必要があります。私は例を挙げることができます。 –

1

あなたは

{ path: 'form', component: FormComponent ,data :{data :'Test Data'} }, 

とコンポーネント

export class FormComponent { 
    sub: any; 
    constructor(private route: ActivatedRoute) { } 
    ngOnInit() { 
     this.sub = this.route 
      .data 
      .subscribe(value => console.log(value)); 
    } 
} 

More Info

しかし、これは好ましい方法、you can use parent child communication or make a service common and share data between themではないかもしれないが述べたようにあなたは、ルータを通過することができます。そのための参考資料を確認してください。

Parent child communication

Share data using service

関連する問題