Angular Ionic — проверка формы, только если определенное поле является определенным значением

#angular #ionic-framework

#angular #ionic-framework

Вопрос:

Я почти уверен, что это легко сделать, но я нигде не могу найти решение.

У меня есть formGroup вызываемая повестка дня. Все поля являются обязательными и действительными до включения отправки. Я также хочу, чтобы последнее поле было действительным, только если оно равно определенному числу, введенному пользователем (определяемому solution ). Я упростил приведенный ниже код:

 <form (ngSubmit)="submitForm()" [formGroup]="agenda" class="bodytext">
  <ion-input type="text" name="email" formControlName="email" required></ion-input>
  <ion-input type="text" name="userSolution" formControlName="userSolution" required></ion-input>
  <ion-button type="submit" expand="block" [disabled]="agenda.invalid">Submit</ion-button>
</form>
 

тогда в файле ts есть мой конструктор:

 constructor( http: HttpClient, private formBuilder: FormBuilder) {
    this.http = http;
    this.agenda = this.formBuilder.group({
      email: [''],
      userSolution: [''],
    });
  }
 

Ответ №1:

Я создал рабочий пример в stackblitz, где я предположил, что число равно 20, когда условие истинно. Также вы можете использовать требуемый валидатор при инициализации формы.

Я использовал пользовательский валидатор, который возвращает имя ошибки в качестве ключа и логическое значение true в качестве значения {errorName: true} , если условие не совпадает, и это имя ошибки может использоваться для сообщения об ошибке проверки.

 export class AppComponent implements OnInit {
  agenda: FormGroup;
  solution = 20;

  constructor(private formBuilder: FormBuilder) {}

  ngOnInit() {
    this.initForm();
  }

  initForm() {
    this.agenda = this.formBuilder.group({
      email: ["", Validators.required],
      userSolution: ["", [Validators.required, this.myValidator(this.solution)]]
    });
  }

  myValidator(num: number): ValidatorFn {
    return (control: AbstractControl): { [key: string]: boolean } | null => {
      if (
        control.value !== undefined amp;amp;
        (isNaN(control.value) || control.value != num)
      ) {
        return { notEqual: true };
      }
      return null;
    };
  }

}
 

Форма-

 <form [formGroup]="agenda" class="bodytext">
  <input type="text" name="email" formControlName="email">
  <input type="text" name="userSolution" formControlName="userSolution">
  <button type="submit" expand="block" [disabled]="agenda.invalid">Submit</button>
</form>
 

Демонстрационная ссылка — StackBlitz

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

1. Я опустил предположение, и теперь я отредактировал решение с помощью CustomValidator, который принимает число во входных данных.

Ответ №2:

Чтобы уточнить, это относится к Angular, а не к Ionic.

Вам нужно создать средство проверки. Самый простой способ — определить функцию и передать ее.

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

ПРИМЕЧАНИЕ: подпись validateUserSolution, вероятно, изменится в зависимости от ваших требований.

  constructor( http: HttpClient, private formBuilder: FormBuilder) 
 {
  this.http = http;
  this.agenda = this.formBuilder.group({
   email: [''],
   userSolution: ['', Validators.compose(validateUserSolution(this.someValue, this.someOtherValue))],
  });
 }

 validateUserSolution(myInput1: string, myInput2: string): boolean {
 // some logic
 }
 

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

1. Мне ужасно жаль, мой angular не особенно хорош, и я не могу понять, как успешно включить то, что вы написали здесь, в мой собственный код. Я предполагаю, что с помощью функции я хочу вернуть true, если userSolution == solution, это правильно? Кроме того, несмотря на то, что я написал функцию, в составе, который я получаю: не удается найти имя ‘validateUserSolution’. Вы имели в виду элемент экземпляра «this.validateUserSolution»?