AbstractControl - базовый класс, просто приведите его:
public form: FormGroup = this.fb.group({
addValue: this.fb.control(null, [this.validatorService.duplicate(this.form.get('values') as FormArray)]),
values: this.fb.array([])
});
Вы также можете отправлять значения напрямую:
this.validatorService.duplicate(this.form ? this.form.get('values').value : []);
и
public duplicate(values: string[]): ValidatorFn {
return (control: AbstractControl): { [key: string]: boolean } | null => {
for (let i = 0, j = values.length; i < j; i++ ) {
if (control.value === values[i]) {
return { 'duplicate': true };
}
}
return null;
};
}
NEWОТВЕТ
Вместо этого добавьте форму Validator:
this.form = this.fb.group({
addValue: this.fb.control(null),
values: this.fb.array(['test2', 'test3'])
}, { validator: this.validatorService.duplicate2 });
, используя этот код:
public duplicate2(control: AbstractControl): ValidationErrors | null {
const newValue = control.get('addValue') ? control.get('addValue').value : null;
const values = control.get('values') ? control.get('values').value : [];
console.log("1 " + newValue);
console.log(values);
for (let i = 0, j = values.length; i < j; i++ ) {
if (newValue === values[i]) {
return { 'duplicate2': true };
}
}
return null;
}
, а также измените свою проверку:
<app-validator [control]="form"></app-validator>
см. https://stackblitz.com/edit/send-validator-formarray-l8j7ys
Вы можете передать имена полей в качестве параметра в валидатор.