トッカンソフトウェア

Angular 親子関係

親子関係を作って、連携してみます。

入力項目の続きからやるので、環境がない場合、そちらを参考に環境構築してください。


親から子に連携

src\app\app.component.ts

入力項目で作成したコンポーネントを親コンポーネントに変更。
				
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  template:
    `<input #hello (keyup)="keyupEvent(hello.value)" placeholder="ここに入力" />
    <app-child [koMsg]="oyaMsg"></app-child>`
})
export class AppComponent {

  oyaMsg = "ここに表示されます。";

  keyupEvent(value: string) {
    this.oyaMsg = value;
  }
}

			
Angular CLIで子コンポーネントを作成。
				
ng generate component child

			

app\child\child.component.ts

@Input()で親からのデータを受け取ります。
				
import { Component } from '@angular/core';
import { Input } from '@angular/core';
@Component({
  selector: 'app-child',
  template:
    `<h1>{{koMsg}}</h1>`
})
export class ChildComponent {
  @Input() koMsg: String = '';
}


			
実行イメージ

子から親に連携

src\app\app.component.ts

				
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  template:
    `<app-child (koOutput)="call($event)"></app-child>
    <h1>{{oyaMsg}}</h1>`
})
export class AppComponent {

  oyaMsg: String = "ここに表示されます。";

  call(koMsg: String) {
    this.oyaMsg = koMsg;
  }
}

			

app\child\child.component.ts

@Output()で親にデータを送ります。送るときはEventEmitter送り、$eventで受け取ります。
				
import { Component } from '@angular/core';
import { Output, EventEmitter } from '@angular/core';
@Component({
  selector: 'app-child',
  template:
    `<input #hello (keyup)="keyupEvent(hello.value)" placeholder="ここに入力" />`
})
export class ChildComponent {
  @Output() koOutput = new EventEmitter<String>();

  keyupEvent(koMsg: string) {
    this.koOutput.emit(koMsg);
  }
}


			
実行イメージ

子と親の連携

今までは文字列の連携でしたが、今回はオブジェクトで連携してみます。

Angular CLIでデータ連携用クラスを作成。
				
ng generate class Data

			

src\app\data.ts

				
export class Data {
    constructor(
        public key: string,
        public val: string
    ) { }
}

			

src\app\app.component.ts

				
import { Component, OnInit } from '@angular/core';
import { Data } from './data';

@Component({
  selector: 'app-root',
  template:
    `
    <table>
    <tr *ngFor="let oyaData of datas">
      <app-child [koInput]="oyaData" (koOutput)="call($event)"></app-child>
    </tr>
    </table>
    <h1>{{oyaMsg}}</h1>
    `
})
export class AppComponent implements OnInit {

  datas: Data[] = [];
  oyaMsg: String = "ここに表示されます。";

  ngOnInit(): void {

    this.datas.push(new Data("key1", "val1"));
    this.datas.push(new Data("key2", "val2"));
  }

  call(eventData: Data) {

    this.oyaMsg = eventData.key + ":" + eventData.val;
    this.datas.push(eventData);
  }
}

			
child.component.ts
				
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { Data } from '../data';

@Component({
  selector: 'app-child',
  template:
    `
    <td>{{koInput.key}}</td>
    <td>{{koInput.val}}</td>
    <td><button (click)="clicked(koInput)">button</button></td>
    `
})
export class ChildComponent {
  @Input() koInput!: Data;
  @Output() koOutput = new EventEmitter<Data>();

  clicked(clickData: Data) {
    clickData.val += "+";
    this.koOutput.emit(clickData);
  }
}


			
実行イメージ



ページのトップへ戻る