【问题标题】:Show errors messages only after form submit仅在表单提交后显示错误消息
【发布时间】:2019-07-16 06:43:33
【问题描述】:

我正在创建带有验证的 Angular 6 表单。我只想在提交表单后显示错误消息。重要的事实是在打字过程中消息不应该改变。因此,例如,当用户没有在输入中输入任何内容然后提交表单时,应该会出现所需的消息。之后,当用户键入内容时,消息应该一直可见,直到下一次按下提交按钮。此外,当满足先前的规则时,错误消息不应更改为另一个。老实说,我不知道是否可以使用 Reactive Forms。

app.component.html

<form [formGroup]="form" novalidate (ngSubmit)="submit()" #myform="ngForm">
    <input class="input" type="text" formControlName="firstName" />   
    <p *ngIf="form.get('firstName').hasError('required') && myform.submitted">
      Name is required
    </p>
    <p *ngIf="form.get('firstName').hasError('minlength') && myform.submitted">
      Min length of string is {{form.controls.firstName.errors.minlength.requiredLength}}    
    </p>
    <button type="submit">Submit</button>
</form> 

app.component.ts

export class AppComponent  {
  form: FormGroup
  constructor(private fb: FormBuilder,) {
      this.form = this.fb.group({
          firstName: ['', [Validators.required, Validators.minLength(5)]]
      });
  }

  submit() {
    console.log(this.form);
  }
}

演示:stackblitz

感谢您的帮助!

【问题讨论】:

  • 我认为反应式表单是不可能的。模板驱动的表单更灵活,您可以轻松自定义。
  • @shadowman_93,不可能什么都不是 :)(另外,我不同意你的观点:对我来说,反应式表单比模板驱动表单更灵活)

标签: javascript angular forms angular-forms


【解决方案1】:

从 Angular 7 开始,您可以使用:{updateOn:'submit'} 或 {updateOn:'blur'}

*更新使用新的 FormGroup 和新的 FormControl(使用 formBuilder 不起作用)

当你想纠正错误时使用 {updateOn:'blur'}

this.form = new FormGroup({
        firstName:new FormControl('', 
          [Validators.required, Validators.minLength(5)])
      },{updateOn:'submit'});

*Update 2 如果您想与 formBuilder 一起使用,请参阅 the answer to Q in *

【讨论】:

【解决方案2】:

您可以像这样在提交函数中检查验证:

<p *ngIf="requiredError">
  Name is required
</p>
<p *ngIf="invalid">
  Min length of string is {{form.controls.firstName.errors.minlength.requiredLength}}    
</p>

  invalid: boolean;
  requiredError: boolean;
  submit() {
    console.log(this.form);
    this.invalid = this.form.get('firstName').hasError('minlength');
    this.requiredError = this.form.get('firstName').hasError('required');
  }

【讨论】:

  • 在您的示例中 {{form.controls.firstName.errors.minlength.requiredLength}} 不能使用。由于字符串长度超过 5 个字符,控制台将抛出错误。但否则它会按我的预期工作,所以感谢您的努力! :)
  • 你可以像这样使用问号:{{form.controls.firstName.errors?.minlength?.requiredLength}}