リアクティブフォーム - フィールドをタッチ済みとしてマークする 質問する

リアクティブフォーム - フィールドをタッチ済みとしてマークする 質問する

すべてのフォームのフィールドをタッチ済みとしてマークする方法がわからず困っています。主な問題は、フィールドをタッチせずにフォームを送信しようとすると、検証エラーが表示されないことです。コントローラーにそのコード用のプレースホルダーがあります。
私のアイデアはシンプルです。

  1. ユーザーが送信ボタンをクリックする
  2. すべてのフィールドがタッチ済みとしてマークされます
  3. エラーフォーマッタが再実行され、検証エラーが表示されます

新しいメソッドを実装せずに、送信時にエラーを表示する他の方法を知っている方がいたら、ぜひ共有してください。ありがとうございます!


私の簡略化された形式:

<form class="form-horizontal" [formGroup]="form" (ngSubmit)="onSubmit(form.value)">
    <input type="text" id="title" class="form-control" formControlName="title">
    <span class="help-block" *ngIf="formErrors.title">{{ formErrors.title }}</span>
    <button>Submit</button>
</form>

そして私のコントローラー:

import {Component, OnInit} from '@angular/core';
import {FormGroup, FormBuilder, Validators} from '@angular/forms';

@Component({
  selector   : 'pastebin-root',
  templateUrl: './app.component.html',
  styleUrls  : ['./app.component.css']
})
export class AppComponent implements OnInit {
  form: FormGroup;
  formErrors = {
    'title': ''
  };
  validationMessages = {
    'title': {
      'required': 'Title is required.'
    }
  };

  constructor(private fb: FormBuilder) {
  }

  ngOnInit(): void {
    this.buildForm();
  }

  onSubmit(form: any): void {
    // somehow touch all elements so onValueChanged will generate correct error messages

    this.onValueChanged();
    if (this.form.valid) {
      console.log(form);
    }
  }

  buildForm(): void {
    this.form = this.fb.group({
      'title': ['', Validators.required]
    });
    this.form.valueChanges
      .subscribe(data => this.onValueChanged(data));
  }

  onValueChanged(data?: any) {
    if (!this.form) {
      return;
    }

    const form = this.form;

    for (const field in this.formErrors) {
      if (!this.formErrors.hasOwnProperty(field)) {
        continue;
      }

      // clear previous error message (if any)
      this.formErrors[field] = '';
      const control = form.get(field);
      if (control && control.touched && !control.valid) {
        const messages = this.validationMessages[field];
        for (const key in control.errors) {
          if (!control.errors.hasOwnProperty(key)) {
            continue;
          }
          this.formErrors[field] += messages[key] + ' ';
        }
      }
    }
  }
}

ベストアンサー1

から角度8単に

this.form.markAllAsTouched();

コントロールとその子孫コントロールをタッチ済みとしてマークします。

アブストラクトコントロールドキュメント

おすすめ記事