[解決済み] Angularのルーティングされたコンポーネントにデータを渡すにはどうしたらいいですか?
質問
私のAngular 2ルートのテンプレートの一つで( ファーストコンポーネント ) ボタンがあります。
first.component.html
<div class="button" click="routeWithData()">Pass data and route</div>
私の ゴール を達成することです。
ボタンクリック -> のルートを、データを保持したまま、他のコンポーネントをディレクティブとして使用することなく、他のコンポーネントに移動させる。
こんな感じでやってみました...。
1番目のアプローチ
同じビューに、ユーザーインタラクションに基づく同じデータを収集して保存しています。
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}
)]
この方法の問題点は、私が推測するところでは 複雑なデータを渡すことができない (例えば オブジェクト property3のように)in-urlで表示されます。
2番目のアプローチ
別の方法として、SecondComponentを以下のように含めることができます。 ディレクティブ をFirstComponentの中に入れてください。
<SecondComponent [p3]="property3"></SecondComponent>
しかし、私は ルート を、そのコンポーネントにインクルードするのではなく、そのコンポーネントへ転送します。
第3のアプローチ
ここで私が考える最も現実的な解決策は サービス (例:FirstComponentService)を使って
- 店舗 FirstComponentのrouteWithData()でデータ(_firstComponentService.storeData())を取得します。
- 取得する のデータ(_firstComponentService.retrieveData())を取得します。 ngOnInit() で セカンドコンポーネント
この方法は完全に実行可能なように見えますが、目標を達成するための最も簡単で/最もエレガントな方法であるかどうかは疑問です。
一般的に、私は、他の 可能性のあるアプローチ コンポーネント間のデータの受け渡し、特に できるだけ少ないコード量で
解決方法は?
4.0.0アップデート
Angularを見る Angular Router - ナビゲートする前にデータを取得する をご覧ください。
オリジナル
サービスを利用するのがよいでしょう。route paramsには、ブラウザのURLバーに反映させたいデータのみを渡してください。
参照:Angular Angular Cookbook コンポーネント通信 - 双方向サービス .
RC.4で出荷されたルーターでは、再度
data
constructor(private route: ActivatedRoute) {}
const routes: RouterConfig = [
{path: '', redirectTo: '/heroes', pathMatch: 'full'},
{path: 'heroes', component: HeroDetailComponent, data: {some_data: 'some value'}}
];
class HeroDetailComponent {
ngOnInit() {
this.sub = this.route
.data
.subscribe(v => console.log(v));
}
ngOnDestroy() {
this.sub.unsubscribe();
}
}
以下もご参照ください。 プランカー .
関連
-
[解決済み] Angular [disabled]="MyBoolean "が動作しない。
-
[解決済み] コンストラクタとngOnInitの違いについて
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] Angular HTMLバインディング
-
[解決済み] Angular:*ngClassを使った条件付きクラス
-
[解決済み] モジュール "@angular-devkit/build-angular" が見つかりませんでした。
-
[解決済み] Angular 2のキープレスごとの変更イベント
-
[解決済み] Angular 5 - クリップボードにコピーする
-
[解決済み] Angularアプリケーションが本番モードと開発モードのどちらで動作しているかを確認する方法
-
[解決済み】Angular - サービスとコンポーネントでパイプを使用する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Angular 2+でngShowとngHideに相当するものは何ですか?
-
[解決済み] コンポーネントテンプレートで要素を選択するには?
-
[解決済み] Angularの@Directiveと@Componentの比較
-
[解決済み] ngIf」は「div」の既知のプロパティではないため、バインドできない [重複] 。
-
[解決済み] SubjectとBehaviorSubjectの違いは何ですか?
-
[解決済み】Angular 2のオプションルートパラメーター
-
[解決済み] Angular CLI Error: serveコマンドはAngularプロジェクトで実行する必要がありますが、プロジェクト定義が見つかりませんでした。
-
[解決済み] '合成プロパティ @panelState を発見しました。BrowserAnimationsModule" か "NoopAnimationsModule" のどちらかを入れてください'。
-
[解決済み] Angular 6 素材マットセレクトの変更方法が削除されました。
-
[解決済み] angular2 tslintの警告を止めるためにコンポーネントのデフォルトプレフィックスを変更する方法