在我的FormGroup中,有一个FormArray包含n个FormControls,每个FormControls都有一个电子邮件验证器。
我希望我的FormArray能够知道是否有任何FormArray控件有电子邮件验证错误,如果有,则FormError errors属性应设置为{email:true}
。
为此,我编写了一个应用于FormArray的自定义验证器。但是,当FormControl元素被添加或从FormArray中移除时,此验证器似乎不能正确触发。
this.form = this.formBuilder.group({
alertContacts: this.formBuilder.array(this.alertData.alertContacts, [Validators.required, alertContactsArrayValidator]),
});
此表单数组由子组件控制,该子组件在实例化时将formArray的一个crefenece作为输入传递给它。子组件中向formArray添加值的方法是
pushToFormcontrol(value: any) {
if(!this.fArray.value.includes(value)){
if(this.usesAutocomplete){
if(this.autocompleteData.some(el => el === value)) {
this.fArray.push(this.formBuilder.control(value));
this.filterAutocomplete();
this.clearInput();
}
} else {
this.fArray.push(this.formBuilder.control(value, [Validators.email]));
this.clearInput();
}
}
this.fArray.markAsDirty();
}
export function alertContactsArrayValidator(): ValidatorFn {
return (formArray: FormArray): { [key: string]: any } | null => {
console.log(formArray);
let hasEmailErrors = false;
let formControls = formArray.controls;
console.log(formControls);
formControls.forEach(control => {
let controlErrors: ValidationErrors = control.errors;
console.log("Current control errors: ", controlErrors);
Object.keys(controlErrors).forEach(key => {
if (key === 'email') {
hasEmailErrors = true;
console.log("key has email");
}
});
});
return hasEmailErrors ? {email: true} : null;
};
}
经过进一步的实验,我发现了一些有趣的东西。如果我修改我的FormArray以便插入一个空数组而不是我的this.alertdata.alertcontacts
(字符串数组),验证器可以完美地工作。我开始认为这是我创建FormArray的方式的问题。
this.form = this.formBuilder.group({
alertContacts: this.formBuilder.array([], [Validators.required, alertContactsArrayValidator]), //An empty array works fine
});
如果我想用已经在其中的元素实例化我的FormArray,我是否应该用不同的方式来完成它,而不是仅仅将数组作为this.formbuilder.array()
方法的第一个参数传递?
与validator
不同,validatorfn
应该手动触发(Angular不会调用它本身来让您传递一些有用的配置)如下所示:
this.form = this.formBuilder.group({
alertContacts: this.formBuilder.array(
this.alertData.alertContacts,
[Validators.required, alertContactsArrayValidator()]
),
});
编辑:
this.form = this.formBuilder.group({
alertContacts: this.formBuilder.array(
this.alertData.alertContacts.map(x => new FormControl(x, [
Validators.required,
alertContactsArrayValidator()
])),
),
});
我正在开发spring mvc应用程序,我应该在spring mvc validator的基础上应用验证。第一步,我为类和设置控制器添加了注释,效果很好。现在我需要实现自定义验证器来执行复杂的逻辑,但我想使用现有的注释并添加额外的检查。 我的用户类: 我的验证器: 我的控制器: 那么,有可能同时使用自定义验证器和注释吗?如果是,怎么做?
任何进入CustomValidator实现的bean都始终为空。我使用的是Spring Boot 2,应用程序是REST API,我没有使用MVC。 我已经尝试了所有我读到的关于这件事的东西,但到目前为止运气都不好。 例如,这里的这个话题对我来说并不适用 否则我应该验证吗?,我已经坚持了2天了。 这是我的配置类: 我的CustomValidator如下所示: JPA实体: 注释:
表单验证发生在数据验证之后。如果你需要定制化这个过程,有几个不同的地方可以修改,每个地方的目的不一样。表单处理过程中要运行三种类别的验证方法。它们通常在你调用表单的is_valid() 方法时执行。还有其它方法可以触发验证过程(访问errors 属性或直接调用full_clean() ),但是通用情况下不需要。 一般情况下,如果处理的数据有问题,每个类别的验证方法都会引发ValidationErr
我有以下验证器,用于验证更新请求。 object.getIdCreditor()有一个值,但是findById方法的执行["CreditorRepository.findById(object.getIdCreditor())" ] 进入NullPointer异常 我不明白怎么了。
我有一个Spring Boot应用程序,它包含一个用户类——所有字段都有标准的JSR-303注释(@NotNull、@Size等),验证工作正常。 但是,当我向User添加自定义验证时,我无法将依赖项注入自定义验证器: @uniqueUsername注释声明为: 注释字段: 以及验证程序的用法: 问题是UserRepository在UniqueUsernameValidator中没有自动配置。字段
我有一个可以创建和编辑组的应用程序。每个团体都有一个独特的头衔。当有人试图创建新组时,我会检查是否有具有该标题的组,如果有,则验证失败。问题是,当有人试图编辑组而不更改标题时,根据我的自定义验证,有一个组具有该标题(有人正在编辑的标题),而我的验证失败,因此用户无法保存该组。所以我想问一下,是否有人能解决这个问题。非常感谢您的回答! 我的班级 我的验证器接口 我的验证器