У меня есть FormArray в FormGroup, и каждый из FormArray имеет несколько FormGroup и может добавлять их динамически.
У меня есть Custom Validator, где он проверяет все данные в каждом из FormArray для проверкиповторение данных. С этим связана проблема: одна FormGroup в FormArray сравнивает ее со всеми данными в FormArray и возвращает True, поскольку FormGroup существует внутри FormArray
Ссылка StackBlits: https://stackblitz.com/edit/angular-custom-validator-defaultdata
Шаги проблемы: Нажмите на дополнительное назначение => Выберите позицию, отдел и местоположение, как в предыдущем ряду.=> Вы увидите ошибку «Данные того же задания» => Теперь измените значение Позиции на что-то другое => Нет ошибки => Измените значение на входе Pay Rate => Вы видите ошибку «Та же работа»data "> Поскольку он сравнивает измененную строку с данными из данных формы, которые определенно вернут значение True.
Можно ли как-то ограничить возникновение ошибки при проверке собственных данных?
Я проверяю только сходство между Положением, Отделом и Местоположением.
for (let assign of this.additionalAssign) {
const fg = new FormGroup({
"payRate": new FormControl(assign.jobRate, Validators.required),
"position": new FormControl(assign.position, Validators.required),
"location": new FormControl(assign.location, Validators.required),
"department": new FormControl(assign.department, Validators.required)
});
fg.validator = this.jobDataValidator.bind(this);
this.addPay.push(fg);
}
Валидатор:
jobDataValidator(control: FormControl): {[s: string]: boolean} {
let value = this.getJobLocDeptValidity(control);
if(value.length > 0 && control.dirty){
return {'sameJobData': true};
}
return null;
}
getJobLocDeptValidity(control: FormControl):any[] {
let additionalAssignments = this.additionalAssignmentsForm.value.payArray;
let test = additionalAssignments.filter(item => !!control.value.position && item.position === control.value.position && !!control.value.department && item.department === control.value.department && !!control.value.location && item.location === control.value.location);
return test;
}
Изображение 1: Данные новой строки (3-ий)то же, что и предыдущий (2-й) => Отображаемая ошибка
Изображение 2. Изменение значения выбора позиции и исчезновение ошибки
Изображение 3: Введите какое-то число в поле ввода Pay Pay, и снова появится сообщение об ошибке.