Angular - назначить пользовательский валидатор для FormGroup - PullRequest
0 голосов
/ 29 июня 2018

Мне нужно назначить пользовательский валидатор для FormGroup. Я могу сделать это во время создания FormGroup следующим образом:

let myForm : FormGroup;

myForm = this.formBuilder.group({
        myControl1: defaultValue,
        myControl2: defaultValue
      }, { validator: this.comparisonValidator })

comparisonValidator(g: FormGroup) {
      if (g.get('myControl1').value > g.get('myControl2'.value)) {
        g.controls['myControl1'].setErrors({ 'value2GreaterThanValue1': true });
        return;
      }
}

У меня есть ситуация, когда мне нужно добавить пользовательский валидатор после Я создал экземпляр FormGroup, поэтому я пытаюсь сделать это после создания myForm вместо добавления валидатора, когда форма создается:

let myForm : FormGroup;

myForm = this.formBuilder.group({
        myControl1: defaultValue,
        myControl2: defaultValue
      })

this.myForm.validator = this.comparisonValidator;

Это дает мне ошибку компилятора:

Type '(g: FormGroup) => void' is not assignable to type 'ValidatorFn'.
  Type 'void' is not assignable to type 'ValidationErrors'.

Как назначить валидатор моему FormGroup, чтобы formGroup передавался в качестве аргумента моей comparisonValidator функции?

Обновление - Я добавил строку, показывающую, где я делаю setErrors в своем comparisonValidator, чтобы было более точно понять, как я пытаюсь установить ошибку проверки.

Ответы [ 4 ]

0 голосов
/ 13 марта 2019

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

0 голосов
/ 29 июня 2018

Для установки любых валидаторов (предопределенных или таможенных) после создания экземпляра formGroup вам нужно будет использовать метод setValiators () FormGroup. Например:

  let myFormGroup = this.    _fb.group({
      control1: new FormControl('1', [])
    });
  myFormGroup.setValidators(this.customValidators());
  customValidators(): ValidatorFn {
   let myFun = (cc: FormGroup): ValidationErrors => {
     if(cc.valid) return null;
     else return {something: 'someError'};
   };
   return myFun;
  }

Вы можете играть здесь.

0 голосов
/ 29 июня 2018

Спасибо @Anuradha Gunasekara - его ответ - самое правильное и полное решение. «Быстрое исправление» для моей ошибки состояло в том, чтобы просто добавить тип проверки any в валидаторе. Я все еще могу назначить пользовательский валидатор для FormGroup, и FormGroup будет неявно передан в качестве аргумента моему пользовательскому валидатору. Этот код будет работать:

let myForm : FormGroup;

myForm = this.formBuilder.group({
           myControl1: defaultValue,
           myControl2: defaultValue
         })

this.myForm.validator = this.comparisonValidator;

comparisonValidator(g: FormGroup) : any {
      if (g.get('myControl1').value > g.get('myControl2'.value)) {
        g.controls['myControl1'].setErrors({ 'value2GreaterThanValue1': true });
      }
}
0 голосов
/ 29 июня 2018

Я создал stackblitz взглянуть.

В файле component.ts

import { Component } from '@angular/core';
import {FormBuilder,FormGroup, ValidationErrors, ValidatorFn} from '@angular/forms'

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  myForm: FormGroup;
  defaultValue = 20;

constructor(private formBuilder: FormBuilder) {
  this.myForm = this.formBuilder.group({
        myControl1: this.defaultValue,
        myControl2: this.defaultValue
      });
      debugger
      this.myForm.setValidators(this.comparisonValidator())
}

 public comparisonValidator() : ValidatorFn{
       return (group: FormGroup): ValidationErrors => {
          const control1 = group.controls['myControl1'];
          const control2 = group.controls['myControl2'];
          if (control1.value !== control2.value) {
             control2.setErrors({notEquivalent: true});
          } else {
             control2.setErrors(null);
          }
          return;
    };
 }
}

В файле component.html

<div>
  <form [formGroup]="myForm">
    <input formControlName="myControl1" type="number">
    <input formControlName="myControl2"  type="number">
    <br>Errors: {{myForm.get('myControl2').errors | json}}
  </form>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...