我在组件的模板上有一个表单:
<form (ngSubmit)="submitLogin(loginForm)" #loginForm="ngForm">
<mat-input-container>
<input matInput [placeholder]="'User Name'" ngModel name="username" autofocus required>
</mat-input-container>
<br>
<mat-input-container>
<input matInput [placeholder]="'Password'" ngModel type="password" name="password" required>
</mat-input-container>
<br>
<button [disabled]="loginForm.invalid" mat-raised-button type="submit">
Login
</button>
</form>
这是我的组件的提交处理程序:
public submitLogin(loginForm: NgForm) {
return this.authService.login(loginForm.value)
.subscribe(
res => this.router.navigate(['/customers']),
error => loginForm.controls.password.reset() // this place!
);
}
它的工作原理和登录错误(传递一些随机值)我看到了
问题即可。如何在表格上重置精确的fileld并使其真正原始且不受影响?所以它应该是有效的,而不是用UI上的红色“无效”边框标记它。
在loginForm.controls.password.reset()
之后我发现loginForm.controls.password.touched
false 而loginForm.controls.password.pristine
是真,但我也看到loginForm.controls.password.status
1}}是“无效”。如果我破解并直接将“ VALID ”值分配给status
属性,则红色无效边框会消失,但如果我专注于该字段,则会打破丢失焦点失效没有任何输入就离开了。应该有合法的方式来重置表格并使其在同一时间有效。
答案 0 :(得分:3)
这似乎是一个已知问题。根据 this ,错误状态计算如下:
isInvalid && (isTouched || isSubmitted)
因此,当您提交表单时,isSubmitted
标记设置为true
,因此条件已满足,您的字段显示为红色。有一些解决方法,如果您要重置整个表单,可以使用resetForm
代替,但在这里您只想重置一个字段,所以......
suggestion 使用 ErrorStateMatcher
:
<input matInput
[placeholder]="'Password'"
ngModel type="password"
name="password" required
[errorStateMatcher]="matcher">
ErrorStateMatcher:
export class MyErrorStateMatcher implements ErrorStateMatcher {
isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
// show errors when touched and invalid
return (control.invalid && control.touched);
}
}
并在您的TS中声明ErrorStateMatcher:
matcher = new MyErrorStateMatcher();
似乎有效: StackBlitz
答案 1 :(得分:0)
您可以使用markAs
现有功能
像这样的东西
this.loginForm.controls.password.reset()
this.loginForm.controls.password.markAsPristine()
this.loginForm.controls.password.markAsUntouched()
this.loginForm.controls.password.updateValueAndValidity()
这些是实际的API函数,用于强制执行特定状态并且不希望完全依赖Angular决定该字段的状态应该是什么
检查here如何更好地使用updateValueAndValidity
方法