#angular #angular-reactive-forms #angular9 #angular-forms #formarray
#угловой #угловые реактивные формы #angular9 #угловые формы #formarray
Вопрос:
Я использую реактивную форму, а форма имеет 60 полей. итак, я написал asyncvalidtors для проверки на стороне сервера.
Примечание: Не использовать изменения значений mechanism.it работает с двумя строками ниже
formGroup.ProductId.setErrors(null, { onlySelf: true, emitEvent: false });
formGroup.ProductId.updateValueAndValidity({ onlySelf: true, emitEvent:false});
Проблема с механизмом валидаторов
Я столкнулся с проблемой в следующих сценариях. В асинхронных валидаторах у меня есть вариант использования, если элемент управления ProductName действителен, и установить значение ошибки null для полей ProductID.я установил ошибки и при выполнении updateValueandValidity отправляю другой запрос на сервер .
if(result.controlName =='ProductName' amp;amp; result.Validation==true){
// if control Name is productName // set Errors as Null for Product ID
formGroup.ProductId.setErrors(null, { onlySelf: true, emitEvent: false });
formGroup.ProductId.updateValueAndValidity({ onlySelf: true, emitEvent: false });
//But it recursively call while perform this line
}
валидаторы
export class SomeAsyncValidator {
static createValidator = (someService: SomeService) => (control: AbstractControl) =>
timer(500)
.pipe(
debounceTime(2000)
// If previous query is different from current
, distinctUntilChanged(),
map(() => control.value),
switchMap((name) => someService.exists({ request })),
map(() => ({
if(result.controlName =='ProductName' amp;amp; result.Validation==true){
// if control Name is productName // set Errors as Null for Product ID
formGroup.ProductId.setErrors(null, { onlySelf: true, emitEvent: false });
formGroup.ProductId.updateValueAndValidity({ onlySelf: true, emitEvent: false });
//But it recursively call while perform this line
}
})),
catchError(() => of(null)));
}
Комментарии:
1. может быть, вы можете попытаться вызвать
updateValueAndValidity({ onlySelf: true })
2. извините, что пытался
{ onlySelf: true, emitEvent: false }
забыл добавить в вопрос обновлено3. это работает для изменений значений, а не для валидаторов
4. хорошо, тогда, возможно, попробуйте добавить
distinctUntilChanged()
в канал5. гона говорит, что ваша ошибка вызвана вызовом
setErrors
вручную при попытке использовать valdiators. вы не должны этого делать, так что это похоже на проблему дизайна. если ваша проверка включает в себя несколько полей, вероятно, это должен быть валидатор группы. вы должны описать реальную проблему, которую вы пытаетесь решить здесь, чтобы вы могли получить помощь с вашим дизайном.