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如何记录日志_Laravel Logging系统配置与自定义日志通道
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
如何快速完成中国万网建站详细流程?
如何快速启动建站代理加盟业务?
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
奇安信“盘古石”团队突破 iOS 26.1 提权
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
移动端脚本框架Hammer.js
如何在VPS电脑上快速搭建网站?
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
Java解压缩zip - 解压缩多个文件或文件夹实例
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
javascript中闭包概念与用法深入理解
Laravel如何使用Vite进行前端资源打包?(配置示例)
高性能网站服务器部署指南:稳定运行与安全配置优化方案
如何在Windows虚拟主机上快速搭建网站?
如何在阿里云高效完成企业建站全流程?
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
Android滚轮选择时间控件使用详解
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
黑客如何利用漏洞与弱口令入侵网站服务器?
IOS倒计时设置UIButton标题title的抖动问题
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
UC浏览器如何设置启动页 UC浏览器启动页设置方法
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
C#如何调用原生C++ COM对象详解
如何用好域名打造高点击率的自主建站?
如何快速搭建高效简练网站?
如何在Windows 2008云服务器安全搭建网站?
canvas 画布在主流浏览器中的尺寸限制详细介绍
微信小程序 配置文件详细介绍
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
Python面向对象测试方法_mock解析【教程】
大连 网站制作,大连天途有线官网?
JavaScript如何操作视频_媒体API怎么控制播放
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
如何制作一个表白网站视频,关于勇敢表白的小标题?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
如何快速重置建站主机并恢复默认配置?
如何在阿里云完成域名注册与建站?
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
如何快速上传自定义模板至建站之星?
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】

