Dev Study
← 解説「イベントバインディング — ( ) で操作を受け取る」に戻る

サンプルコードで身につける: イベントバインディング — ( ) で操作を受け取る

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1クリックでメソッドを呼ぶ

イベントバインディングの最小例で、(click) にメソッドを割り当ててクリック回数を数えます。メソッドがプロパティを書き換えると、補間の表示も自動で更新される、という「操作→データ→表示」の流れの出発点です。

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

@Component({
  selector: 'app-like-button',
  // (click)="メソッド()" でクリックをクラスに届ける
  template:
    '<button (click)="addLike()">いいね</button>' +
    '<p>{{ likes }} 件</p>',
})
export class LikeButtonComponent {
  likes = 0;

  addLike() {
    this.likes++; // 値が変わると表示も自動で更新される
  }
}

2$event で入力された文字を受け取る

(input) イベントに $event を渡すと、イベントの詳細(どの要素で何が起きたか)をメソッドで受け取れます。入力欄の現在の値は event.target から取り出します。リアルタイムに入力内容を反映するUIの土台になるパターンです。

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

@Component({
  selector: 'app-name-input',
  // $event にはイベントの詳細情報が入っている
  template:
    '<input (input)="onInput($event)">' +
    '<p>入力中: {{ typedName }}</p>',
})
export class NameInputComponent {
  typedName = '';

  onInput(e: Event) {
    // 入力欄の現在の値は event.target から取り出す
    this.typedName = (e.target as HTMLInputElement).value;
  }
}

3マウスの出入りに反応する

イベントバインディングはクリック専用ではなく、(mouseenter) や (mouseleave) などあらゆるDOMイベントに同じ書き方で使えます。1つの要素に複数のイベントを並べられることも示しています。ツールチップの表示やホバー時の案内表示などで使われる形です。

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

@Component({
  selector: 'app-hover-area',
  // 1つの要素に複数のイベントバインディングを並べられる
  template:
    '<div (mouseenter)="onEnter()" (mouseleave)="onLeave()">' +
    '{{ message }}</div>',
})
export class HoverAreaComponent {
  message = 'マウスを乗せてください';

  onEnter() {
    this.message = 'いらっしゃいませ!';
  }

  onLeave() {
    this.message = 'またどうぞ';
  }
}

4Enterキーだけに反応する

(keyup.enter) のようにキー名を付けると、特定のキーだけに反応するバインディングが書けます。キー判定のif文を自分で書く必要がないAngularの便利な省略記法です。「Enterで確定」という操作はメモ、チャット、検索などあらゆる入力UIに登場します。

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

@Component({
  selector: 'app-memo-input',
  // keyup.enter は「Enterキーが離されたとき」だけ発火する
  template:
    '<input (input)="onInput($event)" (keyup.enter)="save()">' +
    '<p>保存済み: {{ savedMemo }}</p>',
})
export class MemoInputComponent {
  draft = '';
  savedMemo = '';

  onInput(e: Event) {
    this.draft = (e.target as HTMLInputElement).value;
  }

  save() {
    this.savedMemo = this.draft;
  }
}

5検索フォームを組み立てる

入力(input)と確定(click)という2種類のイベントを組み合わせた、実務の検索フォームの骨組みです。入力中の値は下書き用プロパティに貯めておき、検索ボタンで確定する、という2段階の設計がポイントです。確定のタイミングでAPI呼び出しを行うのが実際の検索画面の流れです。

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

@Component({
  selector: 'app-search-form',
  template:
    '<input (input)="onInput($event)" placeholder="商品名で検索">' +
    '<button (click)="search()">検索</button>' +
    '<p>検索キーワード: {{ submittedQuery }}</p>',
})
export class SearchFormComponent {
  draftQuery = '';
  submittedQuery = '';

  onInput(e: Event) {
    this.draftQuery = (e.target as HTMLInputElement).value;
  }

  search() {
    this.submittedQuery = this.draftQuery; // 実務ではここでAPIを呼ぶ
  }
}