Angular实现响应式表单

发布时间 - 2026-01-11 02:38:33    点击率:

介绍

Angular 总共提供了 3 中表单实现方式,分别是:Template-driven Forms (模板驱动表单) 、 Reactive Forms (响应式表单) 、 Dynamic Forms (动态表单) 。本文只介绍响应式表单。

响应式表单是什么呢?其实跟我们以前用 JQuery 或者其他框架实现的思路差不多,就是使用 HTML 显示数据,然后通过定义一定的校验器、校验规则以及校验提示语,通过事件触发校验后校验不通过的显示提示语,只不过用了 Angular,我们就使用 Angular 提供的语法来实现这个校验过程。

使用

接下来我们通过代码例子来介绍如何使用响应式表单。

引入响应式表单模块

在我们要使用响应式表单的那个模块里面引入响应式表单模块,比如我们在文章模块中使用响应式表单,我们就要在 imports 中添加 ReactiveFormsModule。代码如下

@NgModule({
 imports: [
 RouterModule,
 RouterModule.forChild(articleRoutes),
 SharedModule,
 ReactiveFormsModule,
 NgbModule.forRoot()
 ],
 declarations: [
 HomeComponent,
 DetailComponent,
 CommentComponent,
 CommentViewComponent
 ],
 providers: [
 HomeService,
 DetailService,
 CommentService
 ]
})
export class ArticleModule { }

编写校验器代码

首先我们这里的表单有 3 个字段,分别是 nickname、email、content; nickname 添加必填校验器,email 添加必填和邮箱格式校验器,content添加必填校验器。

首先在 CommentComponent 中注入 FormBuilder 对象,并添加 commentForm 表单组以及创建一个评论对象 comment。

public commentForm: FormGroup;
public comment: Comment = new Comment();

constructor(private formBuilder: FormBuilder){}

定义校验器的提示语 validationMessages, formErrors 是在模板中显示的提示语,提示语来自 validationMessages

public formErrors = {
 "nickname": "",
 "email": "",
 "content": "",
 "formError": ""
}

public validationMessages = {
 "nickname": {
 "required": "昵称不能为空",
 },
 "email": {
 "required": "邮箱不能为空",
 "pattern": "请输入正确的邮箱地址"
 },
 "content": {
 "required": "内容不能为空"
 }
}

在组件启动的函数中构造表单,这时候为每个字段添加了校验器,并且绑定在什么时候触发校验,这里我们在每个值改变的时候触发。

ngOnInit(): void {
 this.buildForm();
}

private buildForm() {
 this.commentForm = this.formBuilder.group({
 "nickname":[
  this.comment.nickname,
  [
  Validators.required
  ]
 ],
 "email": [
  this.comment.email,
  [
  Validators.required,
  Validators.pattern("^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$")
  ]
 ],
 "content": [
  this.comment.content,
  [
  Validators.required
  ]
 ]
 });
 this.commentForm.valueChanges.subscribe(data => this.onValueChanged(data));
 this.onValueChanged();
}

onValueChanged() 方法实现了判断是那个字段校验不通过,然后将该字段的 validationMessages 提示语赋值给 formErrors,在模板那里有判断如果 formErrors.email 等等字段不为空则显示改内容,也即是校验器的提示语

onValueChanged(data?: any) {
 if (!this.commentForm) {
 return;
 }
 const form = this.commentForm;
 for (const field in this.formErrors) {
 this.formErrors[field] = '';
 const control = form.get(field);
 if (control && control.dirty && !control.valid) {
  const messages = this.validationMessages[field];
  for (const key in control.errors) {
  this.formErrors[field] += messages[key] + ' ';
  }
 }
 }

}

HTML 模板代码

我们要关注的是 [formGroup]=”commentForm”、novalidate、formControlName=”nickname”、以及 *ngIf=”formErrors.nickname” 这几个点,并不是指具体的点,而是着重看这些语法的每一个地方,在你自己实现的时候需要根据你的代码修改的。

还有一个是 (ngSubmit)=”sendComment()” 定义了该表单点击提交时调用的函数。

<form [formGroup]="commentForm" (ngSubmit)="sendComment()" role="form" novalidate>
 <div class="control-group">
 <div class="form-group floating-label-form-group controls" [ngClass]="{'has-error': formErrors.nickname}">
  <label>{{ 'comment.nickname' | translate }}</label>
  <input formControlName="nickname" type="text" class="form-control" placeholder="{{ 'comment.nickname' | translate }}">
  <p *ngIf="formErrors.nickname" class="help-block text-danger">
  {{ formErrors.nickname }}
  </p>
 </div>
 </div>
 <div class="control-group" >
 <div class="form-group floating-label-form-group controls" [ngClass]="{'has-error': formErrors.email}">
  <label>{{ 'comment.email' | translate }}</label>
  <input formControlName="email" type="email" class="form-control" placeholder="{{ 'comment.email' | translate }}">
  <p *ngIf="formErrors.email" class="help-block text-danger">
  {{ formErrors.email }}
  </p>
 </div>
 </div>
 <div class="control-group">
 <div class="form-group floating-label-form-group controls" [ngClass]="{'has-error': formErrors.content}">
  <label>{{ 'comment.content' | translate }}</label>
  <textarea formControlName="content" rows="5" class="form-control" placeholder="{{ 'comment.content' | translate }}"></textarea>
  <p *ngIf="formErrors.content" class="help-block text-danger">
  {{ formErrors.content }}
  </p>
 </div>
 </div>
 <p *ngIf="formErrors.formError" class="help-block text-danger">
 {{ formErrors.formError }}
 </p>
 <br>
 <div id="success"></div>
 <div class="form-group">
 <button [disabled]="commentForm.invalid" type="submit" class="btn btn-secondary" >{{ 'comment.submit' | translate }}</button>
 </div>
</form>

GitHub 代码

参考文章

Reactive Forms

效果图


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Angular  # 响应式表单  # angular2  # angular4响应式表单与校验实现demo  # angular中两种表单的区别(响应式和模板驱动表单)  # angular6的响应式表单的实现  # Angular中响应式表单的三种更新值方法详析  # 详解Angular2响应式表单  # Angular中使用响应式表单的详细步骤  # 表单  # 为空  # 必填  # 的是  # 不通过  # 是在  # 什么时候  # 是指  # 你自己  # 要在  # 用了  # 请输入  # 还有一个  # 什么呢  # 即是  # 这几个  # 或者其他  # 来实现  # 绑定  # 如何使用 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  b2c电商网站制作流程,b2c水平综合的电商平台?  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  香港服务器租用每月最低只需15元?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  教你用AI将一段旋律扩展成一首完整的曲子  Android滚轮选择时间控件使用详解  js实现获取鼠标当前的位置  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  如何在云虚拟主机上快速搭建个人网站?  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  网站制作壁纸教程视频,电脑壁纸网站?  手机网站制作与建设方案,手机网站如何建设?  如何在万网主机上快速搭建网站?  装修招标网站设计制作流程,装修招标流程?  黑客如何利用漏洞与弱口令入侵网站服务器?  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Laravel怎么清理缓存_Laravel optimize clear命令详解  Laravel如何使用withoutEvents方法临时禁用模型事件  jQuery 常见小例汇总  如何用免费手机建站系统零基础打造专业网站?  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  如何在阿里云通过域名搭建网站?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  Laravel如何使用查询构建器?(Query Builder高级用法)  微信小程序 配置文件详细介绍  Laravel如何配置Horizon来管理队列?(安装和使用)  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  如何用VPS主机快速搭建个人网站?  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  简历没回改:利用AI润色让你的文字更专业  Laravel如何实现本地化和多语言支持?(i18n教程)  如何在阿里云虚拟主机上快速搭建个人网站?  网站制作免费,什么网站能看正片电影?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  Android实现代码画虚线边框背景效果  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  如何在宝塔面板创建新站点?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  Python制作简易注册登录系统