Angular 2ルートのテンプレートの1つ(FirstComponent)にボタンがあります
first.component.html
<div class="button" click="routeWithData()">Pass data and route</div>
私の目標は達成することです:
ボタンのクリック->他のコンポーネントをディレクティブとして使用せずに、データを保持しながら別のコンポーネントにルーティングします。
これは私が試したものです...
第一のアプローチ
同じビューで、ユーザーの操作に基づいて同じデータを収集して保存しています。
first.component.ts
export class FirstComponent {
constructor(private _router: Router) { }
property1: number;
property2: string;
property3: TypeXY; // this a class, not a primitive type
// here some class methods set the properties above
// DOM events
routeWithData(){
// here route
}
}
通常、私はSecondComponentにルーティングします
this._router.navigate(['SecondComponent']);
最終的にデータを渡す
this._router.navigate(['SecondComponent', {p1: this.property1, p2: property2 }]);
一方、パラメータとのリンクの定義は次のようになります
@RouteConfig([
// ...
{ path: '/SecondComponent/:p1:p2', name: 'SecondComponent', component: SecondComponent}
)]
このアプローチの問題は、URL内の複雑なデータ(たとえば、property3のようなオブジェクト)を渡すことができないことです。
2ndアプローチ
別の方法は、FirstComponentのディレクティブとしてSecondComponentを含めることです。
<SecondComponent [p3]="property3"></SecondComponent>
しかし、それを含めずに、そのコンポーネントにルーティングしたい!
第3のアプローチ
私がここで見る最も実行可能な解決策は、サービス(たとえばFirstComponentService)を使用して
- 保存 FirstComponentでrouteWithData()に(_firstComponentService.storeData())データ
- 取得中(_firstComponentService.retrieveData())のデータをngOnInitを()でSecondComponent
このアプローチは完全に実行可能に思えますが、これが目標を達成するための最も簡単で最もエレガントな方法であるかどうか疑問に思います。
一般に、コンポーネント間でデータを受け渡す他の潜在的なアプローチがないかどうか、特に可能な限り少ないコードで知りたい