【发布时间】:2023-03-22 22:39:01
【问题描述】:
我正在尝试创建一个自定义的反应式表单验证,它允许我传递一个数据数组来检查一个字符串是否已经存在。我能够以一种方式做到这一点,因此这将是一个表单级别的验证,但我无法让它在单个表单控件上工作。
表单级验证
这将在整个表单上产生错误,而不仅仅是那个控件
this.myForm = this.fb.group({
name: ['', Validators.compose([
Validators.required,
]),
],
}, {
validator: (formGroup: FormGroup) => this.checkStringExists(
formGroup.controls.name,
this.arrayOfStrings,
),
});
允许我接受表单控件并根据传入的数组检查它的自定义验证。
checkStringExists(formInput: AbstractControl, names: string[]): { [s: string]: boolean } {
if (names && names.length && formInput && formInput.value) {
const isUnique = !names.find((name) => name === formInput);
if (isUnique) {
return { nameExists: true };
}
}
return null;
}
单独的控件验证(我想这样做的方式)
这只会在特定控件上产生错误
this.myForm = this.fb.group({
name: ['', Validators.compose([
Validators.required,
this.checkStringExists(this.arrayOfStrings),
]),
],
});
允许我仅将数组作为 Validators.compose[] 的一部分的自定义验证 这里
checkStringExists(names: string[]): ValidatorFn {
return (formInput: AbstractControl): ValidationErrors | null => {
if (names && names.length && formInput && formInput.value) {
const isUnique = !names.find((name) => name === formInput);
if (!isUnique) {
return { nameExists: true };
}
}
return null;
};
}
此订阅设置 arrayOfStrings 的值。
mySubscription.subscribe((value: string[]) => {
this.arrayOfStrings = value;
})
我遇到的问题是 arrayOfStrings 可能会更新多次。 如果我以第一种方式使用验证,则 arrayOfStrings 是最新的。如果我使用第二种验证方式,arrayOfStrings 为空/初始值。
我试图让这个验证以第二种方式工作,这样我就可以基于单个控件显示验证,而不是如果整个表单都有这个错误。有谁知道我如何传递这个值并保持最新?
我还在一个单独的帮助文件中包含验证函数,以便在整个应用程序中重复使用。
【问题讨论】:
标签: angular angular-forms