本文へスキップ
BecomeCoder

Angularコース · 第3章 コンポーネントの連携 · レッスン9

@Output で子から親へ知らせる

ブラウザで完結

導入

子で起きたこと(ボタンが押された等)を親に伝えるのが @OutputEventEmitter です。子がイベントを「発火」し、親が受け取ります。

説明

子の「いいね」ボタンが押されたら、親のカウントを増やします。

@Component({
  selector: 'app-like',
  standalone: true,
  template: `<button (click)="onClick()">♥ いいね</button>`,
})
class LikeComponent {
  @Output() liked = new EventEmitter<void>();
  onClick(): void {
    this.liked.emit();
  }
}

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [LikeComponent],
  template: `
    <p>いいねの合計: {{ total }}</p>
    <app-like (liked)="add()"></app-like>
    <app-like (liked)="add()"></app-like>
  `,
})
class AppComponent {
  total: number = 0;
  add(): void { this.total++; }
}
  • @Output() liked = new EventEmitter<void>() … 子が発火できるイベントを宣言。
  • this.liked.emit() … イベントを発火します(値を渡すなら emit(値))。
  • 親は (liked)="add()" と、イベントバインディングで受け取ります。
  • 「入力は [ ](@Input)、出力は ( )(@Output)」という対応がここでもそのまま当てはまります。

やってみよう

EventEmitter<void>EventEmitter<number> に変え、emit(1) で「1」を渡し、親側で (liked)="add($event)"add(n: number){ this.total += n; } と受け取ってみましょう。

実際に動かしてみよう

下のエディタにAngularのコンポーネントを書くと、右側のプレビューにその場で描画されます。本文の例を打ち込んだり書き換えたりして、テンプレート構文やバインディングの動きを確かめながら進めましょう(初回だけ読み込みに少し時間がかかります)。

Angular — ブラウザ内で実行

ブラウザ内でAngular(JIT)を動かす学習用環境(同梱)を読み込みます(初回のみ少し時間がかかります)。
スクロールして表示された時点でも自動で読み込まれます。