概要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 の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: 最新のmysql-5.7.21のインストールと設定方法
>>: Win10 インストール Linux システム チュートリアル ダイアグラム
[概要] この記事では、自作の Docker プラットフォームをベースに完全な ELK システムを素...
最近MySQLデータベースのバージョンを変更する必要があり、それを記録するために記事を書きます1. ...
目次1. 内閣府1. コンセプト2. MHAの構成3. MHAの特徴2. MySQL+MHAをビルド...
このドキュメントの目的はreact-diagramフレームワーク モデルの Json シリアル化を説...
目次序文1. Vue2 のライフサイクルインスタンスのライフサイクルその他のライフサイクルフック2....
目次序文環境の準備カテゴリコンポーネントアプリのコンポーネント1. デフォルトスロット2. 名前付き...
springboot には tomcat サーバーが組み込まれているため、jar パッケージにパッケ...
導入MySQL データベースの読み取りと書き込みの分離を設定すると、データベースに対する書き込み操作...
目次概要延長は必要ですか?スロットJavaScript ユーティリティ関数拡張コンポーネントの複数の...
複雑なテーブル構造では、一部のセルが垂直方向に複数のセルにまたがるため、列間属性 COLSPAN を...
目次1. プロセスとスレッドの概念2. プロセス管理とは何ですか? 3. プロセス管理の役割4. L...
コンピュータを使用すると、システム内に大量のゴミが生成されます。最も一般的なケースは、同じファイルが...
なお、これはvue-cliで作成したプロジェクトではありません。vue.jsを参照して記述したHTM...
この記事では、ディスクを追加または拡張して、Vmare で有効にする方法について説明します。シナリオ...
目次序文配列.isArrayコンストラクタインスタンスプロトタイプオブジェクト.プロトタイプ.toS...