我有一个要验证的确认密码表单控件。
当密码与确认密码输入中的值不同时,我想显示我的mat-error元素。为此,我有一个名为equalPasswords()
的函数。如果功能相同,那么我们将收到true,否则,我们将收到false。
<mat-form-field>
<input matInput placeholder="Repeat password" [formControl]="password2" type="password">
<mat-error *ngIf="password2.invalid && password2.hasError('required')">Password is required</mat-error>
<mat-error *ngIf="!equalPasswords() && !password2.hasError('required')">Passwords need to match</mat-error>
</mat-form-field>
我检查了控制台,当我在密码框中输入两个不同的输入时,equalPasswords()返回false。但是,它仍然没有在DOM中显示错误。
有人知道如何解决此问题吗?
Signup.component.ts
@Component({
selector: 'app-sign-up',
templateUrl: 'sign-up.component.html',
styleUrls: ['sign-up.component.css']
})
export class SignUpComponent implements OnInit {
mySignupForm: FormGroup;
countries = countries;
uniqueUsernameMessage;
uniqueEmailMessage;
formSubmitted = false;
@Output() closeSubmenu = new EventEmitter();
@ViewChild('select') select;
constructor(
private authService: AuthenticationService,
private route: Router,
private navigationService: NavigationService){}
get firstName() { return this.mySignupForm.get('firstName'); }
get lastName() { return this.mySignupForm.get('lastName'); }
get username() { return this.mySignupForm.get('username'); }
get email() { return this.mySignupForm.get('email'); }
get password1() { return this.mySignupForm.get('password1'); }
get password2() { return this.mySignupForm.get('password2'); }
get birthDate() { return this.mySignupForm.get('birthDate'); }
get country() { return this.mySignupForm.get('country'); }
get house() { return this.mySignupForm.get('house'); }
ngOnInit() {
this.mySignupForm = new FormGroup({
firstName: new FormControl(null, Validators.required),
lastName: new FormControl(null, Validators.required),
username: new FormControl(null, [Validators.required, Validators.minLength(5), Validators.maxLength(15)]),
birthDate: new FormControl(null, Validators.required),
password1: new FormControl(null, [Validators.required, Validators.minLength(6), Validators.maxLength(15), Validators.pattern('^.*(?=.{4,10})(?=.*\\d)(?=.*[a-zA-Z]).*$')]),
password2: new FormControl(null, Validators.required),
email: new FormControl(null, [Validators.required, Validators.email]),
country: new FormControl(null, Validators.required),
house: new FormControl(null, Validators.required)
})
}
equalPasswords() {
console.log('equaltest', this.password1.value === this.password2.value);
return this.password1.value === this.password2.value;
}
}
答案 0 :(得分:6)
MatFormField
仅在mat-error
有错误时显示FormControl
元素。它不会仅仅因为您通过ngIfElse
告诉它而显示-只能在表单控件状态下工作。解决此问题的一种方法是创建一个自定义验证器,并使用它来检查密码是否匹配。您还可以通过equalPasswords()
函数在该字段上设置错误。那应该是这样的:
equalPasswords(): boolean {
const matched: boolean = this.password1.value === this.password2.value;
console.log('equaltest', matched);
if (matched) {
this.signupForm.controls.password2.setErrors(null);
} else {
this.signupForm.controls.password2.setErrors({
notMatched: true
});
}
return matched;
}
答案 1 :(得分:0)
我发现了一种非常微妙的情况,可能会发生这种情况。
如果您将[formGroup]
指令放在类似<div>
的地方,则提交表单时它将不会得到submitted == true
(必须在{ {1}}。
提交的表单是显示错误的两个触发器之一-另一个是已触摸该字段的触发器。触摸表示<form>
,这意味着焦点必须已丢失。
这样您就可以得到这种情况:
onBlur
[formGroup]
-访问密码字段(例如,光标仍在该框中)blur
放在[formGroup]
标签上ErrorStateMatcher
如果要将<form>
传递给“哑”子组件(没有自己的形式),则必须使用依赖项注入并在构造函数中传递formGroup
。 / p>