在Angular 7中,使用动态formArray时,可以通过自定义验证器来比较两个值。自定义验证器是一个函数,它接收一个控件作为参数,并返回一个验证结果对象。
首先,我们需要在组件中创建一个自定义验证器函数。这个函数可以在组件类中定义,也可以在单独的验证器文件中定义。以下是一个示例的自定义验证器函数,用于比较两个值:
import { AbstractControl, ValidatorFn } from '@angular/forms';
export function compareValuesValidator(controlName1: string, controlName2: string): ValidatorFn {
return (control: AbstractControl): { [key: string]: any } | null => {
const value1 = control.get(controlName1)?.value;
const value2 = control.get(controlName2)?.value;
if (value1 !== value2) {
return { compareValues: true };
}
return null;
};
}
在这个示例中,compareValuesValidator函数接收两个控件名作为参数,然后返回一个验证器函数。验证器函数接收一个控件作为参数,并在该函数中比较两个控件的值。如果两个值不相等,则返回一个包含compareValues属性的验证结果对象,表示验证失败;否则返回null,表示验证通过。
接下来,在组件中使用这个自定义验证器。假设我们有一个动态formArray,其中包含两个控件,分别是password和confirmPassword。我们可以在组件类中的表单初始化方法中使用自定义验证器,如下所示:
import { FormGroup, FormBuilder } from '@angular/forms';
import { compareValuesValidator } from './compare-values.validator';
@Component({
selector: 'app-my-form',
templateUrl: './my-form.component.html',
styleUrls: ['./my-form.component.css']
})
export class MyFormComponent implements OnInit {
form: FormGroup;
constructor(private formBuilder: FormBuilder) { }
ngOnInit() {
this.form = this.formBuilder.group({
passwords: this.formBuilder.array([
this.formBuilder.control(''),
this.formBuilder.control('')
], { validators: compareValuesValidator('password', 'confirmPassword') })
});
}
}
在这个示例中,我们使用formBuilder创建了一个动态formArray,并在validators选项中传入了compareValuesValidator函数,并指定了需要比较的两个控件名。
最后,在模板中显示验证错误信息。我们可以通过form.get方法获取到动态formArray的验证状态,并根据验证状态显示相应的错误信息。以下是一个示例的模板代码:
<form [formGroup]="form">
<div formArrayName="passwords">
<div *ngFor="let password of form.get('passwords').controls; let i = index">
<input type="password" [formControlName]="i">
</div>
</div>
<div *ngIf="form.get('passwords').errors?.compareValues">
Passwords do not match.
</div>
</form>
在这个示例中,我们使用formArrayName指令将动态formArray绑定到模板中的div元素,并使用formControlName指令将每个控件绑定到对应的input元素上。然后,我们使用*ngIf指令根据验证状态显示错误信息。
这样,当用户输入的两个密码不相等时,会显示"Passwords do not match."的错误信息。
推荐的腾讯云相关产品和产品介绍链接地址:
领取专属 10元无门槛券
手把手带您无忧上云