本文へ移動
rdlabo.devdocs

フォーム

このentry pointはAngular 22 Signal Formsを対象にしています。

Application bootstrapでadapterを一度登録し、Angularの FormFieldKitIonicFormField でSignal FormsをIonic controlへbindします。

import { Component, signal } from '@angular/core';
import type { ApplicationConfig } from '@angular/core';
import { FormField, form, required, email, maxLength } from '@angular/forms/signals';
import { IonInput } from '@ionic/angular';
import { KitIonicFormField, provideKitIonicSignalForms } from '@rdlabo/ionic-angular-kit/forms';

export const appConfig: ApplicationConfig = {
  providers: [provideKitIonicSignalForms()],
};

@Component({
  selector: 'app-profile',
  imports: [FormField, KitIonicFormField, IonInput],
  template: `
    <ion-input label="Name" [formField]="profileForm.name"></ion-input>
    <ion-input label="Email" type="email" [formField]="profileForm.email"></ion-input>
  `,
})
export class ProfilePage {
  readonly profile = signal({ name: '', email: '' });
  readonly profileForm = form(this.profile, (path) => {
    required(path.name);
    email(path.email);
    maxLength(path.name, 200);
  });
}

必須fieldを空のままblurすると、Ionicが errorText を表示し、controlはinvalidかつtouchedになります。Adapterは、最初の空でない明示的なvalidation messageを、ion-inpution-textareaion-selection-checkboxion-radio-groupion-toggle のIonic errorText propertyへcopyします。Angular validatorがmessageを提供しない場合は、validation errorの kind とconstraint metadataから汎用の英語messageを生成します。そのため、built-in validatorではmessage設定が不要です。

未知のcustom error kindは Enter a valid value. へfallbackします。Business ruleの失敗はfield validationの外で扱ってください。互換性のため、明示的なvalidation messageは引き続き優先されます。また、明示的な errorText または [errorText] bindingがあるとadapterはinstantiateされません。

アプリはvalidator定義を変えずに、localization用のfallback resolverを置き換えられます。

import type { ValidationError } from '@angular/forms/signals';
import { KIT_SIGNAL_FORM_ERROR_MESSAGE_RESOLVER } from '@rdlabo/ionic-angular-kit/forms';

export const appConfig: ApplicationConfig = {
  providers: [
    provideKitIonicSignalForms(),
    {
      provide: KIT_SIGNAL_FORM_ERROR_MESSAGE_RESOLVER,
      useValue: (error: ValidationError) => localizedMessageFor(error),
    },
  ],
};

Angularは複数の provideSignalFormsConfig class設定をmergeしません。アプリが独自設定を提供する場合は、両方のproviderを登録して順序に依存せず、必要なclass mappingを1つのproviderへまとめてください。

検査の設定は ESLintでKitの使い方をチェック を参照してください。