Если вы хотите использовать валидатор, который в зависимости от переменной в вашем .ts, вы можете использовать bind (this)
emailFlag:boolean=true;
email=new FormControl("email",this.requiredIf().bind(this))
requiredIf()
{
return (control)=>{
return this.emailFlag?!control.value?{required:true}:null:null
}
}
Будьте осторожны, когда вы изменяете переменную, вам нужно сделать updateValueAndValidity
click(){
this.EmailFlag=!this.EmailFlag
this.email.updateValueAndValidity()
}
см. stackblitz
ПРИМЕЧАНИЕ. Я использую способ this.requiredIf, чтобы разрешить, например, если у вас есть массив required=[true,false,false,true]
, передать «индекс» "к функции
Это
<form [formGroup]="form">
<input formControlName="one">
<small *ngIf="form.get('one').invalid">*</small>
<button (click)="clickArray(0)">click</button>
required:{{required[0]}}<br/>
<input formControlName="two">
<small *ngIf="form.get('two').invalid">*</small>
<button (click)="clickArray(1)">click</button>
required:{{required[1]}}<br/>
<input formControlName="three">
<small *ngIf="form.get('three').invalid">*</small>
<button (click)="clickArray(2)">click</button>
required:{{required[2]}}<br/>
</form>
И вы меняете как
form = new FormGroup({
one: new FormControl("", this.requiredIfArray(0).bind(this)),
two: new FormControl("", this.requiredIfArray(1).bind(this)),
three: new FormControl("", this.requiredIfArray(2).bind(this))
});
requiredIfArray(index) {
return control => {
return this.required[index]? !control.value? { required: true }: null: null;
};
}