рекурсивно инициировать событие false внутри в асинхронных валидаторах-угловые рекативные формы

#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. вы не должны этого делать, так что это похоже на проблему дизайна. если ваша проверка включает в себя несколько полей, вероятно, это должен быть валидатор группы. вы должны описать реальную проблему, которую вы пытаетесь решить здесь, чтобы вы могли получить помощь с вашим дизайном.