angular 6 реактивная форма FormGroup проверка

Попытка добавить валидатор в зависимости от какого-то условия. Когда условие истинно, я добавляю требуемый валидатор и удаляю его, когда он ложен.

    createReactiveForm(data: any) {
    const formGroup = new FormGroup({
        'control1': new FormControl(data.key1),
        'control2': new FormControl(data.key2)
    }, this.formValidators.bind(this)),
}


formValidators(formGroup: FormGroup){
    const control1Val: boolean = formGroup.controls['control1'].value;
    if (control1Val) {
        const control2: AbstractControl = formGroup.controls['control2'];
        constrol2.setValidators(Validators.required);
    } else {
        const control2: AbstractControl = formGroup.controls['control2'];
        constrol2.setValidators(() => null);
    }
}
  1. Метод formValidators () вызывается бесконечное количество раз - делаю ли я здесь что-нибудь не так?

  2. Когда условие истинно, оно добавляет валидаторы и отображает ошибку. Но когда условие ложно, валидаторы удаляются, но ошибка в элементе управления все еще существует - в чем причина?

  3. Хороший ли подход - привязать метод formValidators () к formGroup?

Помогите мне в этом.


person Yashavanta Byagawadi    schedule 03.09.2018    source источник


Ответы (1)


  1. Нет, он вызывается при каждом цикле обнаружения изменений / изменении управления.
  2. Позвоните control.setErrors(null).
  3. Второй параметр ожидает функцию. С вашим кодом проблем нет.

Функция Validator должна возвращать объект error или null. Я не рекомендую помещать вашу логику в функцию валидатора, так как это не подходящее место. Вы можете прослушать control1 valueChanges и переместить туда логику. Таким образом вы оптимизируете код для запуска только при изменении значения control1.

person Bazinga    schedule 03.09.2018
comment
В остальной части добавлен updateValueAndValidity (). Но не вышло. - person Yashavanta Byagawadi; 03.09.2018
comment
Попробуйте вызвать control.setErrors (null); - person Bazinga; 03.09.2018
comment
Ok. Я понял. Функция валидатора должна возвращать null или объект ошибки. Вот почему нам нужно сделать control.setErrors (null). Большое тебе спасибо. - person Yashavanta Byagawadi; 03.09.2018