Angular 角度:有条件地触发选择性表单验证
角度:有条件地触发选择性表单验证 我使用的是带有验证的反应式表单-“必需”和其他表单字段,如min、max等。表单中有两个按钮-“保存”和“提交”。保存和提交按钮上的事件将数据保存到中间状态,并根据后端逻辑分别提交 对于Submit按钮,我已通过将disabled属性绑定到表单的invalid状态来禁用它,直到表单有效为止。对于Save按钮,如果根据定义的验证字段无效,则需要禁用它,但“required”验证除外。这是为了检查是否输入了任何无效输入Angular 角度:有条件地触发选择性表单验证,angular,angular-reactive-forms,reactive-forms,Angular,Angular Reactive Forms,Reactive Forms,角度:有条件地触发选择性表单验证 我使用的是带有验证的反应式表单-“必需”和其他表单字段,如min、max等。表单中有两个按钮-“保存”和“提交”。保存和提交按钮上的事件将数据保存到中间状态,并根据后端逻辑分别提交 对于Submit按钮,我已通过将disabled属性绑定到表单的invalid状态来禁用它,直到表单有效为止。对于Save按钮,如果根据定义的验证字段无效,则需要禁用它,但“required”验证除外。这是为了检查是否输入了任何无效输入 例如,考虑以下表格 this.register
例如,考虑以下表格
this.registerForm = this.formBuilder.group({
name: [''],
email: ['', [Validators.required, Validators.email]],
})
在这种情况下,如果在字段中输入了无效的输入,我需要禁用该按钮,但如果为空,则需要启用该按钮,即忽略“必需”验证。禁用另一个按钮(即提交按钮)需要“必需”验证
如何实现对不同按钮的选择性验证?因此,基本上我使用了两种不同的方法来实现它,因为您只有
电子邮件
字段上有验证器,您可以直接检查它,而且您可以检查它到底有哪些错误,这就是我使用的:
get isSaveValid(): boolean {
let emailControl = this.registerForm.get('email');
return emailControl.valid ||
emailControl.hasError('required') &&
Object.keys(emailControl.errors).length === 1;
}
get isSubmitValid(): boolean {
let emailControl = this.registerForm.get('email');
return emailControl.valid;
}
和绑定:
<button [disabled]="!isSaveValid">Save</button>
<button [disabled]="!isSubmitValid">Submit</button>
保存
提交
IsSaveValid()
仅当emailControl
有效时,或当它有必需的
错误并且是唯一的错误时,才为true
。所以,换句话说,用户将能够绕过所需的约束进行保存,但所有其他验证器都可以工作(例如电子邮件
)。
有一个问题。希望有帮助 因此,基本上我使用了两种不同的方法来实现它,因为您只在
email
字段上有验证器,您可以直接检查它,而且您可以检查它到底有哪些错误,这就是我使用的:
get isSaveValid(): boolean {
let emailControl = this.registerForm.get('email');
return emailControl.valid ||
emailControl.hasError('required') &&
Object.keys(emailControl.errors).length === 1;
}
get isSubmitValid(): boolean {
let emailControl = this.registerForm.get('email');
return emailControl.valid;
}
和绑定:
<button [disabled]="!isSaveValid">Save</button>
<button [disabled]="!isSubmitValid">Submit</button>
保存
提交
IsSaveValid()
仅当emailControl
有效时,或当它有必需的
错误并且是唯一的错误时,才为true
。所以,换句话说,用户将能够绕过所需的约束进行保存,但所有其他验证器都可以工作(例如电子邮件
)。
有一个问题。希望有帮助 另一种方法是在不需要验证器的情况下设置整个表单。然后订阅:
this.registerForm.valueChanges.subscribe(val => {
console.log(`Name is ${val.name} email is ${val.email}.`);
});
每次用户进行任何更改时,都会调用此函数。在这里,您可以执行以下简单的必要检查:
if (val.name && val.email) { // simply to get is there any input (for required fields)
this.submitValid = true;
}
在html中,您仍然可以绑定到registerForm.valid,但用于保存按钮。对于submit按钮,绑定到“submitValid”。另一种方法是在不需要验证器的情况下设置整个表单。然后订阅:
this.registerForm.valueChanges.subscribe(val => {
console.log(`Name is ${val.name} email is ${val.email}.`);
});
每次用户进行任何更改时,都会调用此函数。在这里,您可以执行以下简单的必要检查:
if (val.name && val.email) { // simply to get is there any input (for required fields)
this.submitValid = true;
}
在html中,您仍然可以绑定到registerForm.valid,但用于保存按钮。对于“submit”按钮绑定到“submitValid”。谢谢,而且我认为如果我们在多个字段中迭代form.controls会更好。当然,我很高兴它有帮助!只是一个查询,当绑定到disabled属性时,如何以及何时调用函数isSaveValid/isSubmitValid?他们会不断地调用吗?谢谢,而且我认为如果我们在几个字段的情况下迭代form.controls会更好。当然,我很高兴它有帮助!只是一个查询,当绑定到disabled属性时,如何以及何时调用函数isSaveValid/isSubmitValid?他们会不断地调用吗?