Проверка Angular: Подтвердите / выделите дочерний ввод при нажатии кнопки

#javascript #angular

#javascript #angular

Вопрос:

Используя Angular 6 здесь:

У меня есть родительский компонент, и внутри него у меня есть дочерний компонент. Дочерний компонент имеет текстовые поля. У родителя есть кнопка отправки.

На кнопке отправки щелчка я хочу проверить все входные данные дочернего элемента так, как они требуются, и соответствующим образом выдать ошибку.

Я использую реактивные формы и успешно смог передать информацию о форме от родителя к потомку. Но я не уверен, как выделить мой текстовый ввод при нажатии кнопки отправки.

Я использовал свойство $ touched для своего дочернего элемента, которое работает и показывает требуемую ошибку. Но я хочу, чтобы ошибка также отображалась в случае, если пользователь просто нажал на кнопку.

Вот некоторый соответствующий код.

 --Parent--

<form class="form-horizontal" [formGroup]="myForm" (ngSubmit)="onSubmit()">
    <child [myForm]="myForm"></child>
  <button type="submit">Submit</button>
</form>

<br>
Form Valid:  <pre>{{myForm.valid}}</pre>

export class AppComponent {
  myForm: FormGroup

  constructor(private fb: FormBuilder) {
    this.myForm = this.fb.group({
      uname: ['', Validators.required]
    });
  }

  onSubmit() {
    console.log('value: ', this.myForm.value);
    console.log('the whole form and its controls: ', this.myForm)
  }
}

--Child--

<div class="form-group" [formGroup]="myForm">
    <label for="myForm" class="col-sm-3 control-label">Name:</label>
    <div class="col-sm-8" [ngClass]="{ 'has-error': myForm.controls?.uname.errors }">
      <input type="text" formControlName="uname"  placeholder="Enter Name...">
      <em *ngIf="myForm.hasError('required', 'uname') amp;amp; myForm.controls?.uname.touched">*Required</em>
    </div>
  </div> 

export class ChildComponent {
  @Input() myForm: FormGroup;

  ngOnInit() {

  }
}
  

Я также создал демонстрацию, чтобы показать это на:

https://stackblitz.com/edit/angular-dbevnj

К вашему сведению, это всего лишь образец, который я создал, чтобы показать свою проблему. У меня было бы 2-3 дочерних компонента и несколько элементов управления формой для каждого.

Любые входные данные, как это решить?

Ответ №1:

Мы решили эту проблему, вызвав markAsTouched все элементы управления формой при отправке формы.

В вашем случае вы можете добавить this.myForm.get('uname').markAsTouched(); в свой onSubmit() метод.

Комментарии:

1. Не уверен, что я понимаю, как сделать то, что вы сказали. Моя кнопка отправки находится на родительском элементе управления и ввода на дочернем. Также, даже если кто-то не прикасается к элементу управления, а просто нажимает кнопку, я хочу показать ошибку при вводе.

2. Я обновил ваш метод stackblizt onSubmit. Проверьте здесь . Когда вы нажимаете отправить, ваш элемент управления недействителен, но ошибка не отображается, потому что элемент управления не затронут, но если вы отметите свой элемент управления как затронутый в методе отправки, тогда отображается ошибка. Это была проблема или я неправильно понимаю?

3. Пока это работает, но это означает, что если у нас есть 10 элементов управления на странице, то у нас будет 10 инструкций, как указано выше. Я думал, если при нажатии кнопки отправки передать это значение дочернему элементу управления и в каком-либо случае дочернего элемента управления получить это значение и соответствующим образом отобразить ошибку. Не уверен, что это можно сделать.

4. Вы могли бы просто выполнить итерацию по элементам управления FormGroup и пометить все элементы управления как затронутые