Angular 响应式表单 基础例子

news/2024/7/2 1:27:18

1、案例需求

表单提交,表单全部校验成功才能提交,当表单校验错误,表单边框变红,同时有错误提示信息,有重置功能

2、代码分析

  • 在线预览
  • git仓库

本案例中使用了响应式表单,响应式表单在表单的校验方面非常方便

2.1、注册 ReactiveFormsModule

要使用响应式表单,就要从 @angular/forms 包中导入 ReactiveFormsModule 并把它添加到你的 NgModule 的 imports 数组中。

app.module.ts

imports: [
    BrowserModule,
    AppRoutingModule,
    ReactiveFormsModule
  ]

2.2、使用 FormBuilder 来生成表单控件

当需要与多个表单打交道时,手动创建多个表单控件实例会非常繁琐。FormBuilder 服务提供了一些便捷方法来生成表单控件。FormBuilder 在幕后也使用同样的方式来创建和返回这些实例,只是用起来更简单。

  • 注入 FormBuilder 服务
constructor(
    private fb: FormBuilder
  ) { }
  • 生成表单控件

FormBuilder 提供了一个语法糖,以简化 FormControl、FormGroup 或 FormArray 实例的创建过程。它会减少构建复杂表单时所需的样板代码的数量(new FormControl)。

formGroup: FormGroup;

this.formGroup = this.fb.group({
      name: '',
      age: '',
      sex: ''
    });

2.3、FormGroupDirective

formGroup 是一个输入指令,它接受一个 formGroup 实例,它会使用这个 formGroup 实例去匹配 FormControl、FormGroup、FormArray 实例,所以模版中的 formControlName 必须和 formGroup 中的 name 匹配。

<form [formGroup]="formGroup" (ngSubmit)="submit()" novalidate>
  <div class="form-group">
    <label>姓名:</label>
    <input type="text"
      formControlName="name">
      <p>{{nameErrorMessage}}</p>
  </div>
</form>

2.4、表单状态

每个表单控件都有自己的状态,共五个状态属性,都是布尔值。

  • valid 表单值是否有效
  • pristine 表单值是否未改变
  • dirty 表单值是否已改变
  • touched 表单是否已被访问过
  • untouched 表单是否未被访问过

以输入姓名的表单为例,只验证该表单的必填项时。表单先获取焦点并且输入姓名,最后移除焦点,每一步表单的状态如下:

初始状态
状态
validfalse
pristinetrue
dirtyfalse
touchedfalse
untouchedtrue
输入状态
状态
validtrue
pristinefalse
dirtytrue
touchedfalse
untouchedtrue
失去焦点后状态
状态
validtrue
pristinefalse
dirtytrue
touchedtrue
untouchedtrue

2.5、表单校验

表单验证用于验证用户的输入,以确保其完整和正确。Angular内置的了一些校验器,如 Validators.required, Validators.maxlength,Validators.minlength, Validators.pattern,但是不能自定义错误提示信息,所以实用性不强,满足不了业务场景的需求,于是我们可以自定义表单校验器。

自定义表单校验器

name-validator.ts

import { AbstractControl, ValidatorFn } from '@angular/forms';

export function nameValidator(): ValidatorFn {
  return (control: AbstractControl): { [key: string]: any } => {

    if (!control.value) {
      return { message: '请输入必选项' };
    }

    if (control.value.length > 10) {
      return { message: '名称大于10位了' };
    }

    return null;

  };
}

使用自定义验证器

app.component.ts

this.formGroup = this.fb.group({
      name: ['', nameValidator()],
      age: ['', ageValidator()],
      sex: ['', sexValidator()]
    });

显示错误提示信息

当页面初始化的时候不应该显示错误信息,也就是表单touched为true

// Error
private errorMessage(name): string {
    const control = this.formGroup.controls[name];
    return (control.touched && control.invalid) ? control.errors.message : '';
  }

然而touched只有失去焦点才为true,在输入的时候一直为false。导致在输入的时候,表单校验错误,却显示不了错误信息。因此需要再次判断 dirty 状态,只要表单值改变,则为false

private errorMessage(name): string {
    const control = this.formGroup.controls[name];
    return ((control.touched || control.dirty) && control.invalid) ? control.errors.message : '';
  }

2.6、markAsTouched

未对表单操作时,点击提交按钮时,则模拟表单被touched,显示提示信息

markFormGroupTouched(formGroup: FormGroup) {
    (<any>Object).values(formGroup.controls).forEach(item => {
      if (item.controls) {
        this.markFormGroupTouched(item);
      } else {
        item.markAsTouched();
      }
    });
  }

http://www.niftyadmin.cn/n/834179.html

相关文章

软件测试常见笔试面试题---含答案

一、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行&#xff0c;即是通常说的软件的可移植性。 兼容的类型&#xff0c;如果细分的话&#xff0c;有平台的兼容&#xff0c;网络兼容&…

使用python发送QQ邮件

2019独角兽企业重金招聘Python工程师标准>>> 这里用到了Python的两个包来发送邮件&#xff1a; smtplib 和 email 。   Python 的 email 模块里包含了许多实用的邮件格式设置函数&#xff0c;可以用来创建邮件“包裹”。使用的 MIMEText 对象&#xff0c;为底层的…

fescar源码解析系列(一)之启动详解

fescar是gts刚开源的版本&#xff0c;对gts关注已久&#xff0c;比较熟悉其原理&#xff0c;而半年前自己又开发了一个可用版本meepo&#xff08;详情&#xff09;&#xff0c;所以对fescar的源码也是必看。通过比较&#xff0c;可以看meepo设计上的不足&#xff0c;以及一些编…

自动化工具eclipse安装流程----(安装失败解决方法)

一、安装JDK环境变量配置 电脑32位/64位** &#xff08;1&#xff09;安装JDK 环境变量配置&#xff08;32/64位&#xff09; &#xff08;2&#xff09;安装JDK最好是默认地址&#xff0c;安装后会出现两个文件夹&#xff08;jdk版本号 )(jre7&#xff09; 二、安装完JDK后配…

软件评测师备考--计算机系统构成及硬件基础知识-2

一、常见输入/输出设备 输入/输出控制器 功能&#xff1a; 协调和制数据的输入/输出 具体体现&#xff1a;冲锁存数据&#xff0c;地址译码&#xff0c;传递命令&#xff0c;码制转换&#xff0c;电子转换 二、组成 寄存器➡️控制电路 1&#xff09;数据 2&#xff09;状态…

软件测试-互联网公司测试面试流程

上海互联网某家公司面试流程如下&#xff1a; 1、你们公司做性能测试流程是怎样的&#xff1f; 2、监控数据怎么做的&#xff1f; 3、jmeter怎么实现参数关联的&#xff1f; 4、压测主要关注哪些性能指标&#xff1f; 5、压测总共生产多少数据&#xff1f; 6、jvm知道做少说一…

如何将手机录音文件转换成MP3格式

我们的工作和生活常常离不开录音&#xff0c;工作中录音可以给我们带来很多便捷&#xff0c;生活中录音可以给我们带来很多欢乐&#xff0c;那么什么工作是最需要录音的呢&#xff1f;比如说记者这个行业吧&#xff0c;记者它是主要采访和报道的一门工作&#xff0c;突然有一天…

腾讯qlv格式怎么转换MP4格式?告诉你一个超简单的方法

1、打开 www.xxxbbbttt.com 上传你的视频&#xff08;腾讯qlv&#xff0c;爱奇艺qsv、优酷kux&#xff09;都可以。2、点击转换按钮&#xff0c;转换好后&#xff0c;我们把转换的视频下载到电脑里&#xff0c;就可以看到视频已经是MP4格式了。转载于:https://blog.51cto.com/1…