Angularの親子コンポーネント通信の詳細な説明

Angularの親子コンポーネント通信の詳細な説明

概要

Angularコンポーネント通信

コンポーネント ツリー、番号 1 はルート コンポーネント AppComponent です。

コンポーネントは疎結合されており、互いの知識が少ないほど良いです。

コンポーネント 4 のボタンをクリックすると、コンポーネント 5 の初期化ロジックがトリガーされます。

従来のアプローチ: ボタン 4 のクリック イベントでコンポーネント 5 のメソッドを呼び出します。タイトカップリング。

Angular: コンポーネント 4 がコンポーネント 5 の存在をまったく認識せずに実装されています。

疎結合を使用してコンポーネント間でデータを渡し、再利用性の高いコンポーネントを開発します。

入力プロパティと出力プロパティを使用して、親子関係にあるコンポーネント間でデータを渡します。

1. 入力および出力プロパティの概要

コンポーネントはブラックボックス モデルとして設計されており、入力プロパティを使用して外部から受信した内容を宣言します。これらのものがどこから来たのかを知る必要はありません。

コンポーネントは、外部から必要なものが提供されたときに、何をすべきかを知るだけで済みます。

コンポーネントは出力プロパティを通じてイベントを発行し、外部の世界に興味深い内容を伝えます。どのコンポーネントにイベントが発行されるかを知る必要はありません。

興味のある人は誰でも、コンポーネントによって発行されるイベントをサブスクライブできます。

2. 入力属性

サブコンポーネントは、@Input() デコレータで装飾された 2 つの入力プロパティを定義します。

@入力()
  在庫コード: 文字列;
  @入力()
  量:数値;

親コンポーネントは、属性を子コンポーネントの入力属性にバインドすることにより、stock 属性を子コンポーネントの stockCode 属性にバインドします。

<div>
  私は親コンポーネントです</div>
<div>
  <input type="text" [(ngModel)]="stock" placeholder="株コードを入力してください">
  <app-order [stockCode]=在庫 [amount]="100"></app-order>
</div>

3. プロパティバインディングは親コンポーネントから子コンポーネントへの一方向です。

サブコンポーネントの stockCode の値を 3 秒ごとに Apple にリセットします。

OrderComponentクラスをエクスポートし、OnInitを実装します。

  @入力()
  stockCode: 文字列;
  @入力()
  量:数値;

  コンストラクタ() { 
    設定間隔(()=>{
      this.stockCode = 'Apple'
    },3000)
  }

  ngOnInit() {
  }
}

子コンポーネントの stockCode の値が Apple に変更されても、親コンポーネントの stock の値は変更されません。これは、バインディングが一方向であることを意味します。親コンポーネントのみが子コンポーネントを変更でき、子コンポーネントのプロパティを変更しても親コンポーネントには影響しません。

4. 出力プロパティ

Angular コンポーネントは EventEmitter オブジェクトを使用してカスタム イベントを発行し、他のコンポーネントで処理することができます。 EventEmitter は、Rxjs の Subject クラスのサブクラスです。レスポンシブ プログラミングでは、オブザーバーとしてもオブザーバーとしても使用できます。つまり、EventEmitter オブジェクトは、emit メソッドを通じてカスタム イベントを発行することができ、また、subscribe メソッドを通じて EventEmitter によって発行されたイベント ストリームをサブスクライブすることもできます。

EventEmit を使用してコンポーネント内からイベントを発行するにはどうすればよいですか?

シナリオ例: 見積コンポーネント

証券取引所に接続し、株価の変化をリアルタイムで表示できるコンポーネントが必要だとします。このコンポーネントをさまざまな金融アプリケーションで再利用できるようにするには、株価をリアルタイムで表示するだけでなく、コンポーネントの外部に最新の株価を送信して、他のコンポーネントが株価の変化に基づいて対応するビジネス ロジックを実行できるようにする必要があります。

注: クラスまたはインターフェースを使用して特定のデータ構造を明示的に定義することをお勧めします。

1. まずIBMの株価のリアルタイムの変化をシミュレートする

エクスポートクラス PriceQuoteComponent は OnInit を実装します {

  // 株価サービスに接続せず、乱数ジェネレータを使用して株価の変化をシミュレートし、株価コードと最新価格を表示します。stockCode:string="IBM";
  価格:数;

  コンストラクタ() {
    設定間隔(()=>{
      priceQuote:PriceQuote = new PriceQuote(this.stockCode,100*Math.random()); とします。
      this.price=priceQuote.lastPrice;
    },1000)
  }

  ngOnInit() {
  }

}


//株価情報をカプセル化するために引用オブジェクトをカプセル化します //クラスまたはインターフェースを使用して特定のデータ構造を明確に定義することは良い習慣です export class PriceQuote {
  コンストラクター(public stockCode: string, //株価コード public lastPrice: number //最新価格) {
  }
}

2. 情報を出力し、購読に興味がある人を外部に知らせる

EventEmit の背後にある型は、発行されるイベント内のデータの型です。

'@angular/core' から Component、OnInit、EventEmitter、Output をインポートします。

@成分({
  セレクター: 'app-price-quote',
  テンプレート URL: './price-quote.component.html',
  スタイル URL: ['./price-quote.component.css']
})
エクスポートクラス PriceQuoteComponent は OnInit を実装します {

  // 株価サービスに接続せず、乱数ジェネレータを使用して株価の変化をシミュレートし、株価コードと最新価格を表示します。stockCode: string = "IBM";
  価格: 数;

  @Output() // 出力イベントはOutputとして記述する必要があります
  //EventEmitter には汎用の lastPrice が必要です: EventEmitter<PriceQuote> = new EventEmitter();
  //

  コンストラクタ() {
    間隔を設定する(() => {
      priceQuote を作成します: PriceQuote = new PriceQuote(this.stockCode, 100 * Math.random());
      this.price = priceQuote.lastPrice;
      //lastPrice を使用して値を出力します this.lastPrice.emit(priceQuote);
    }, 1000)
  }

  ngOnInit() {
  }

}
//株価情報をカプセル化するために引用オブジェクトをカプセル化します //クラスまたはインターフェースを使用して特定のデータ構造を明確に定義することは良い習慣です export class PriceQuote {
  コンストラクター(public stockCode: string, //株価コード public lastPrice: number //最新価格) {
  }
}

3. 見積情報を受信し、親コンポーネントに表示する

親コンポーネント テンプレートは、イベント バインディングを通じてこのイベントをキャプチャして処理します。

クラスAppComponentをエクスポートします。
  在庫 = "";
  価格見積: 価格見積 = 新しい価格見積("", 0);

  //イベントの種類は、子コンポーネントが発行するときに発行されるデータのタイプです //親コンポーネントはpriceQuoteHandler(event:PriceQuote){を取得できます
    this.priceQuote=イベント;
  }
}

ステンシル

<!-- デフォルトでは、イベント名は出力属性の名前になります -->
<app-price-quote (lastPrice)="priceQuoteHandler($event)"></app-price-quote>

<div>
  これは引用コンポーネントの外側にあります<br/>
  株式コードは{{priceQuote.stockCode}}です。
  株価は{{priceQuote.lastPrice | number:"2.0-2"}}です
</div>

デフォルトでは、イベント名は出力属性の名前です。イベント名は次のように変更できます。

@Output("priceChange") // イベントを起動するには出力が必要です
  //EventEmitter には汎用の lastPrice が必要です: EventEmitter<PriceQuote> = new EventEmitter();

テンプレートも変更され、

<app-price-quote (priceChange)="priceQuoteHandler($event)"></app-price-quote>

要約する

イベントは出力プロパティを通じて発行され、データはイベントを通じて伝達されます。これらは、親コンポーネント テンプレートのイベント バインディングを通じてキャプチャされ、処理されます。

2 つのコンポーネント間に親子関係がない場合に、疎結合でデータを渡す方法。このとき、仲介モードを使用する必要があります。

上記は、Angular 親子コンポーネント間の通信の詳細な説明です。Angular 親子コンポーネント間の通信の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Angularの動的コンポーネントの詳細な説明
  • Angular のパフォーマンス最適化: サードパーティ コンポーネントと遅延読み込みテクノロジー
  • Angularコンポーネント間の通信の実装例
  • 角度コンポーネント間の値転送テスト方法の詳細な説明
  • Angular7はプロジェクト、コンポーネント、サービスを作成し、サービスを使用します
  • Angular イベント: 異なるコンポーネント間でデータを渡す方法
  • Angularjs1.5 関数を使用してコンポーネントの外部に値を渡す例
  • Angular6 学習ノートの詳細説明: マスタースレーブコンポーネント
  • Angularコンポーネントの仲介モードの詳細な説明

<<:  最新のmysql-5.7.21のインストールと設定方法

>>:  Win10 インストール Linux システム チュートリアル ダイアグラム

推薦する

MySQLのページング制限のパフォーマンス問題についての簡単な説明

MySQL ページング クエリは通常、制限を通じて実装されます。 limit は 1 つまたは 2 ...

データベース復旧エラーの原因となる MySQL 文字セットの簡単な分析

MySQL の文字セットエンコーディングが正しくないデータをインポートすると、エラーが表示されます。...

条件付きコメント形式の書き方とサンプルコード

フロントエンドエンジニアとして、IE は私たちにとって馴染み深いものであるはずです。設計案を実装する...

MySQL における「:=」と「=」の違いの簡単な分析

=設定および更新の場合にのみ、:= と同じ効果、つまり代入効果があり、それ以外の場合は等号の効果があ...

Javascript ツリー メニュー (11 項目)

1. dhtmlxツリー dHTMLxTree は機能豊富なツリー メニュー コントロールです。豊...

Vueコンポーネントの詳細な説明

<本文> <div id="ルート"> <h2&...

Docker+K8S クラスタ環境構築と分散アプリケーション展開

1. Dockerをインストールする yumでdockerをインストール #サービスを開始する sy...

フロントエンド JavaScript でローカルあいまい検索機能を実装する方法の例

目次1. プロジェクトの見通し2. 知識ポイントObject.assign() の使用法filter...

mysqlパラメータsql_safe_updatesを使用して更新/削除範囲を制限する方法の詳細な説明

序文皆さんご存知のとおり、MySQL の運用・保守において、更新/削除条件が誤っているためにデータが...

スーパーバイザーによるDockerfileのマルチサービスイメージパッケージ操作

Dockerfileの作成yumソースを設定する cd /tmp/docker vim Docker...

Vue ソング プログレス バーのサンプル コード

なお、これはvue-cliで作成したプロジェクトではありません。vue.jsを参照して記述したHTM...

Vue3 Vue イベント処理ガイド

目次1. 基本的なイベント処理2. 親コンポーネントにカスタムイベントを送信するマウス修飾子4. キ...

ウェブページのエクスペリエンス: ウェブページのカラーマッチング

<br />ウェブページの色はウェブサイトのイメージを確立する鍵の一つですが、ネットユー...

JavaScript の静的スコープと動的スコープを例を使って説明します

目次序文静的スコープと動的スコープ静的スコープ実行プロセス動的スコープ実行プロセスエクササイズ練習1...

MySQL ツリー構造テーブルの設計と最適化に関する簡単な説明

序文多くの管理・オフィスシステムでは、ツリー構造がいたるところで見られます。たとえば、「部門」や「機...