トッカンソフトウェア

Angular シグナルフォーム

テンプレート駆動フォームリアクティブフォームと比べてソースがすっきりして見やすいです。

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

サンプルソース

src\app\app.ts


import { Component, signal, computed } from '@angular/core';
import { form, FormField } from '@angular/forms/signals';

interface LoginData {
  email: string;
  password: string;
}

@Component({
  selector: 'app-root',
  imports: [FormField],
  template:
    `
<form (submit)="onSubmit($event)">
  <label>
    Email:
    <input type="email" [formField]="loginForm.email" />
  </label>
  <label>
    Password:
    <input type="password" [formField]="loginForm.password" />
  </label>

  <button type="submit" [disabled]="this.notInput()">Log In</button>
  <button type="button" (click)="onClick()">Clear</button>

  @if(loginForm.email().value().length == 0){
    <div>Emailを入力して下さい。</div>
  }@else if(loginForm.password().value().length == 0){
    <div>パスワードを入力して下さい。</div>
  }

</form>
    `
})
export class App {

  loginModel = signal<LoginData>({
    email: '',
    password: '',
  });

  loginForm = form(this.loginModel);

  notInput = computed(() =>
    this.loginModel().email.length == 0
    || this.loginModel().password.length == 0
  );

  onSubmit(event: Event) {
    event.preventDefault();

    const credentials = this.loginModel();

    console.log(credentials);
    alert(JSON.stringify(credentials));
  }

  onClick() {
    this.loginModel.set({
      email: '',
      password: '',
    });
    // 個別にセット
    // this.loginForm.email().value.set('');
  }
}

以下で実行できます。
				
ng serve --open

			

実行イメージ

シグナルを作成し、form()でフォームオブジェクトを作成します。
画面との連携はformFieldで指定して連携します。

ページのトップへ戻る