【发布时间】:2019-02-11 13:39:35
【问题描述】:
我知道网络上有很多关于同一主题的主题,但我无法找到适合我的解决方案。
我有一个用angular的formBuilder制作的表单,它是一个配置文件表单,我们可以在其中更改密码,所以我们输入了三个密码:旧密码,新密码和新密码确认。
这是表格:
this.editProfileForm = this.formBuilder.group({
lastname: ['', Validators.required],
firstname: ['', Validators.required],
email: ['', [Validators.required, Validators.email]],
phone: [this.phone.replace(/\s/g, ''), [Validators.pattern('[0-9]{10}')]],
birthdate: ['', [Validators.required]],
password: [''],
new_password: [''],
new_password_confirm: [''],
});
this.editProfileForm.setValidators([this.ageValidator, this.samePasswordValidator, this.requiredPasswordValidator]);
我尝试做的是仅在其中一个不为空时才设置密码字段。如果用户开始输入其中一个密码字段,那么这三个字段都是必需的。
这是我的尝试:
public requiredPasswordValidator(form: FormGroup): any {
if (form.controls.password.value || form.controls.new_password.value || form.controls.new_password_confirm.value) {
form.controls.password.setValidators([Validators.required]);
form.controls.new_password.setValidators([Validators.required, Validators.minLength(6)]);
form.controls.new_password_confirm.setValidators([Validators.required, Validators.minLength(6)]);
}
}
这似乎有效,但并不完美,只有当我开始输入并擦除这些字段时才需要这些字段,并且每个字段都是如此。例如,如果我输入密码字段,则不需要 new 和 new_confirm,但如果我在新的 pw 输入中输入一个随机字母并将其删除,则该字段是必需的。
我不知道我的解释是否真的很清楚,如果您需要更多信息,请咨询我。
谢谢。
编辑
我尝试了 Ankur Jain 解决方案,但仍然遇到同样的问题:
这里是函数:
public formControlValueChanged(): void {
this.editProfileForm.get('password').valueChanges.subscribe(
(mode: string) => {
if (mode) {
this.f.new_password.setValidators([Validators.required]);
this.f.new_password_confirm.setValidators([Validators.required]);
}
});
}
(我使用 this.f 是因为使用 juste new_password 和 new_password 确认它会引发错误,this.f 是一个返回 editProfileForm.controls 的函数)
我在 ngOninit 中调用它:
this.formControlValueChanged();
我也尝试将this.editProfileForm.updateValueAndValidity(); 添加到函数中,但这没有任何改变。
【问题讨论】:
-
为什么不尝试在所有可以返回三个对象数组的 formGroup 上创建一个自定义验证器(其中一些可以为空)?
标签: angular forms validation