0Pricing
Angular Academy · レッスン

カスタムコントロールのバリデーション

カスタムコントロールからバリデーターを提供します

「カスタムコントロールのバリデーション」はCoddyKit上の無料Angular Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAngular Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Angular Academyコースには全4レッスンが含まれています。

自己検証するコントロール

カスタムコントロールは、Validator インターフェースを実装し、NG_VALIDATORS に登録することで独自のバリデーションロジックを持てます。これにより、利用側は追加設定なしで有効性を取得できます。

Validator インターフェース

Validator では、ValidationErrors(エラーマップ)を返す validate メソッドが必要です。有効な場合は null を返します。

import { Validator, ValidationErrors, AbstractControl } from '@angular/forms';

export class RatingComponent implements Validator {
  validate(control: AbstractControl): ValidationErrors | null {
    return control.value > 0 ? null : { required: true };
  }
}

NG_VALIDATORS の登録

NG_VALUE_ACCESSOR と同様に、forwardRef を使って NG_VALIDATORS 用の 2 つ目のマルチプロバイダーを追加します。

import { NG_VALIDATORS } from '@angular/forms';

providers: [
  { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RatingComponent), multi: true },
  { provide: NG_VALIDATORS, useExisting: forwardRef(() => RatingComponent), multi: true }
]

エラーマップの返却

エラーマップのキーは control.errors のエントリになります。テンプレートで具体的なメッセージを表示できるよう、分かりやすいキーと必要に応じたペイロードを使用してください。

validate(control: AbstractControl): ValidationErrors | null {
  const v = control.value;
  if (v == null) return { required: true };
  if (v < this.min) return { min: { required: this.min, actual: v } };
  return null;
}

エラーの利用

テンプレートでは組み込みバリデーターの場合と同じように control.errors を読み取り、コントロールが無効かつ touched のときにメッセージを表示します。

<small *ngIf="form.controls.stars.errors?.['required']">Pick a rating</small>

外部バリデーターとの組み合わせ

コントロール内のバリデーターと、利用側がリアクティブフォームで指定したバリデーターは、どちらも実行されて結果が統合されます。コントロールのルールはフォームのルールを置き換えるのではなく、追加します。

stars: [0, [Validators.required]] // plus the control's own validate()

動的なバリデーション

バリデーションが変更される入力値に依存する場合は、登録済みの変更コールバックを呼び出し、Angular にバリデーションを再実行するよう伝えます。

private onValidatorChange: () => void = () => {};
registerOnValidatorChange(fn: () => void) { this.onValidatorChange = fn; }

@Input() set min(v: number) { this._min = v; this.onValidatorChange(); }

非同期バリデーション

サーバーでのチェックには、エラーの Observable または Promise を返す validate を持つ AsyncValidator を実装し、NG_ASYNC_VALIDATORS に登録します。

validate(control: AbstractControl): Observable<ValidationErrors | null> {
  return this.api.isUnique(control.value).pipe(
    map(ok => ok ? null : { taken: true })
  );
}

役割を絞る

コントロール固有のバリデーションだけをコントロール内に置きます(たとえば、評価値は 0 より大きくする必要があります)。再利用性を保つため、ビジネス固有のルールは利用側のフォームに任せてください。

バリデーションのテスト

値を持つモックのコントロールを渡し、返されたエラーマップまたは null を検証することで、validate を直接ユニットテストします。

it('requires a rating', () => {
  const c = new FormControl(0);
  expect(component.validate(c)).toEqual({ required: true });
});

完全なカスタムコントロール

値アクセサー、無効状態、touched 状態、バリデーションをすべて実装すると、利用側からはネイティブ入力要素と区別できない、完全で再利用可能なフォームコントロールになります。

クイックチェック

バリデーションに関する知識を確認しましょう。

まとめ

Validator.validate を実装してバリデーションを追加し、NG_VALIDATORS に登録してエラーマップを返しました。また、registerOnValidatorChange による動的な再バリデーションに対応し、完全に統合されたカスタムコントロールのために、必要に応じて NG_ASYNC_VALIDATORS と AsyncValidator も利用しました。

よくある質問

「カスタムコントロールのバリデーション」レッスンは無料ですか?

はい。「カスタムコントロールのバリデーション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Angular Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Angular Academyコースには全4レッスンが含まれています。

「カスタムコントロールのバリデーション」で何を学びますか?

カスタムコントロールからバリデーターを提供します ブラウザで直接実行するハンズオンコードでAngular Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Angular Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAngular Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「カスタムコントロールのバリデーション」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAngular Academyレッスンでコードを書いて実行できますか?

はい。すべてのAngular Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ControlValueAccessorインターフェース
  2. 値の書き込みと登録
  3. 無効状態とタッチ状態の処理
  4. カスタムコントロールのバリデーション
← Angular Academyに戻る