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 システム チュートリアル ダイアグラム

推薦する

Javascript での JSBridge に関する予備的研究

目次JSBridgeの起源JSBridgeの双方向通信原理JSはネイティブを呼び出すネイティブコール...

WeChatアプレットがフォーム検証を実装

WeChatアプレットフォームの検証、参考までに具体的な内容は次のとおりです。プラグインWxVali...

docker によってプルされたイメージがどこに保存されるかの詳細な説明

docker によってプルされたコマンドは、デフォルトでは /var/lib/docker/ フォル...

CentOS 7 で rpm パッケージを使用して MySQL 5.7.18 をインストールする

最近、MySQL を使っています。Linux での mysql-installation という記事...

JVM 上の高性能データ形式ライブラリ パッケージである Apache Arrow の紹介とアーキテクチャ (Gkatziouras)

Apache Arrow は、BigQuery を含むさまざまなビッグデータ ツールで使用される一...

MYSQLデータベースの最適化段階を簡単に理解する

導入面接官がこんな質問をしたことはありませんか?データベースをどのように最適化しますか?では、この質...

CSS における zoom:1 属性の定義と機能

今日、CSS の zoom 属性は何のために使用されるのかと尋ねられました。この属性は、フローティン...

HTML 学習ノート - HTML 構文の詳細な説明 (必読)

1. HTML マークアップ言語とは何ですか? HTML は、Web ページの情報を表すマークアッ...

js 配列から重複を削除する 11 の方法

実際の業務や面接では、「配列の重複排除」の問題によく遭遇します。以下は、js を使用して実装された配...

dockerコンテナは直接実行され、pingを介してパブリックIP操作を取得します。

コンテナを通じてローカル パブリック IP アドレスを取得します。ローカル IP アドレスを使用して...

MySQL でテーブルを作成するときの NULL と NOT NULL の使用方法の詳細な説明

MySQL の仕様によっては、テーブル作成仕様にすべてのフィールドが空であってはならないという要件を...

Docker+DockerCompose を使用して Web アプリケーションをカプセル化する方法

目次テクノロジースタックバックエンドビルドAPIフロントエンドウェブ構築ゲートウェイ建設ゲートウェイ...

MySQL データ挿入効率の比較

データを挿入するとき、以前オフィス システムに取り組んでいたときにはデータベースのパフォーマンスにつ...

Windows10のマウスを模倣して境界線を光らせる効果を実現するCSSの詳細解説

最新の Windows 10 アップデートをインストールした後、システム UI の詳細な効果が顕著に...

ウェブページでグレーまたはブラックモードを実現するための CSS3 フィルターコード

フロントエンドcss3 フィルターは、Web ページのグレー効果を実現できるだけでなく、ナイト モー...