matchValidator
будет называться Angular, а не вами.Таким образом, у него не будет доступа к this
компонента.
Так что вам придется привязаться к нему.
Вы можете использовать метод get
для FormGroup
, чтобы получить значение group1
field
: (<FormGroup>this.mainForm.get('group1')).get('field').value
Попробуйте:
Класс компонента:
import { Component } from '@angular/core';
import { FormGroup, FormBuilder, FormControl, ValidatorFn, AbstractControl } from '@angular/forms';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
mainForm: FormGroup;
constructor(private fb: FormBuilder) { }
ngOnInit() {
this.mainForm = this.fb.group({
group1: this.fb.group({
field: []
}),
group2: this.fb.group({
field: [null, [this.matchValidator.bind(this)]]
})
});
}
matchValidator(control: AbstractControl): { [key: string]: boolean } | null {
const fromValue = control.value;
if(this.mainForm) {
const toValue = (<FormGroup>this.mainForm.get('group1')).get('field').value;
if (fromValue && toValue && fromValue === toValue) {
console.log('Control: ', control);
return { 'fieldMatch' : true };
}
console.log('Control: ', control);
return null;
}
}
get group2Field() {
return (<FormGroup>this.mainForm.get('group2')).get('field');
}
}
Шаблон:
<form [formGroup]="mainForm">
<div formGroupName="group1">
<label for="">Group 1 Field</label>
<input type="text" formControlName="field">
</div>
<hr>
<div formGroupName="group2">
<label for="">Group 2 Field</label>
<input type="text" formControlName="field">
<p *ngIf="group2Field?.errors?.fieldMatch">These fields match</p>
</div>
</form>
Вот Образец StackBlitz для вашей ссылки.