You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 10表单提交时触发ngIf验证错误提示的实现方法

Angular 10表单提交时触发未触碰字段的错误提示

你当前的模板驱动表单仅在字段被dirty或touched时显示错误提示,但提交时未触碰的必填字段不会触发提示,导致表单能被提交。要让提交验证不通过时显示和用户触碰字段一致的错误提示,可通过以下几种方式实现:

方案一:提交时标记所有表单字段为touched

这种方式最简洁,只需在提交时将所有表单控件标记为已触碰,触发现有错误提示逻辑。

步骤1:给表单添加模板引用

在表单根元素上添加#myForm="ngForm"引用,以便在组件中获取表单实例:

<form #myForm="ngForm">
  <!-- 你的所有表单字段(包括requestorName等) -->
  
  <div class="question">
    <button class="submit col-md-2" (click)="onSubmit(myForm)">Submit</button>
  </div>
</form>

步骤2:修改onSubmit方法

在提交时遍历表单控件,标记为touched,再执行验证逻辑:

import { NgForm } from '@angular/forms';

// ...组件类内的方法
onSubmit(form: NgForm) {
  // 标记所有字段为已触碰
  Object.keys(form.controls).forEach(key => {
    form.controls[key].markAsTouched();
  });

  // 执行你的自定义验证
  const validityCheck = this.validateModel(this.model);
  if (!validityCheck.isValid) {
    return; // 验证不通过,终止提交
  }

  // 验证通过,执行表单提交逻辑
  // ...你的提交代码
}

方案二:针对未通过验证的字段单独标记touched

如果你希望仅标记验证不通过的字段(而非全部),可修改validateModel函数,在发现字段为空时标记对应控件:

修改validateModel方法

import { NgForm } from '@angular/forms';

validateModel(accessRequest: AccessRequestModel, form: NgForm) {
  const validityCheck = {
    isValid: true,
    reason: null
  };

  if (accessRequest) {
    if (!accessRequest.requestorName) {
      validityCheck.isValid = false;
      validityCheck.reason = 'Requester name is required.';
      form.controls['requestorName'].markAsTouched();
      return validityCheck;
    } else if (!accessRequest.lname) {
      validityCheck.isValid = false;
      validityCheck.reason = 'Last name is required.';
      form.controls['lname'].markAsTouched();
      return validityCheck;
    } else if (!accessRequest.fname) {
      validityCheck.isValid = false;
      validityCheck.reason = 'First name is required.';
      form.controls['fname'].markAsTouched();
      return validityCheck;
    }
    // ...其余字段的验证逻辑(同理添加markAsTouched)
  }
  return validityCheck;
}

修改onSubmit方法

onSubmit(form: NgForm) {
  const validityCheck = this.validateModel(this.model, form);
  if (!validityCheck.isValid) {
    return;
  }
  // 提交逻辑
}

方案三:添加提交状态标记控制错误显示

通过添加一个submitted变量,控制错误提示在提交后显示:

步骤1:组件内定义变量

submitted = false;

步骤2:修改onSubmit方法

onSubmit() {
  this.submitted = true;
  const validityCheck = this.validateModel(this.model);
  if (!validityCheck.isValid) {
    return;
  }
  // 提交逻辑
}

步骤3:修改模板错误提示条件

将每个字段的错误提示*ngIf条件添加submitted:

<div *ngIf="requestorName.invalid && (requestorName.dirty || requestorName.touched || submitted)" class="alert">
  <div *ngIf="requestorName.errors?.required">
    <p class="required">Requester name is required.</p>
  </div>
  <div *ngIf="requestorName.errors?.minlength">
    <p class="required">Requester name must be at least 2 characters long.</p>
  </div>
</div>

以上三种方式都能实现提交时显示未触碰字段的错误提示,推荐方案一,代码更简洁易维护。

内容的提问来源于stack exchange,提问作者Cole Perry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:03:20