Angular NgForm:重置确切形式的字段值不会使其有效

时间:2017-12-29 18:26:50

标签: angular angular-material angular-forms

我在组件的模板上有一个表单:

<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!
    );
}

它的工作原理和登录错误(传递一些随机值)我看到了

enter image description here

问题即可。如何在表格上重置精确的fileld并使其真正原始且不受影响?所以它应该是有效的,而不是用UI上的红色“无效”边框标记它。

loginForm.controls.password.reset()之后我发现loginForm.controls.password.touched false loginForm.controls.password.pristine 是真,但我也看到loginForm.controls.password.status 1}}是“无效”。如果我破解并直接将“ VALID ”值分配给status属性,则红色无效边框会消失,但如果我专注于该字段,则会打破丢失焦点失效没有任何输入就离开了。应该有合法的方式来重置表格并使其在同一时间有效。

2 个答案:

答案 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方法