Angular:Reactive Form的使用方法和自定义验证器
本文将介绍Angular(Angular2+)中Reactive Form的有关内容,包括:
- Reactive Form创建方法
- 如何使用验证
- 自定义验证器
下面开始进入正文!
Reactive Form创建方法
首先我们需要使用FormBuilder创建一个FormGroup,就像这样:
registerForm: FormGroup;
constructor(
private fb: FormBuilder,
) {}
ngOnInit() {
this.registerForm = this.fb.group({
firstName: [''],
lastName: [''],
})
}
上面的firstName和lastName是由你自己取的,分别表示一个表单控件名称。他们的值都是一个数组,数组第一个参数表示初始值。如果你不给它赋予初始值,则给它一个空字符串:''。
然后HTML页面就像这样:
<form [formGroup]="registerForm" (ngSubmit)="handleSubmit(registerForm)">
<label>FirstName:</label>
<input formControlName="firstName">
<label>LastName:</label>
<input formControlName="lastName">
<button type="submit">Submit</button>
</form>
这样就创建了一个非常简单的表单!
如何使用验证
表单的输入项经常是要进行验证的,那该怎么验证呢?
其实很简单,Angular已经为我们写好了一些常用的验证器,就像这样使用就可以了:
ngOnInit() {
this.registerForm = this.fb.group({
firstName: ['', Validators.required],
lastName: ['', Validators.pattern('[A-Za-z0-9]*')],
})
}
可以使用“必要”验证器,也可以使用正则,你只需传入一个正则表达式就可以了。除此之外,还有minLength和maxLength等。
如果一个控件需要多个验证器,可以把它们放在一个数组里面:
lastName: ['', [Validators.pattern('[A-Za-z0-9]*'), Validators.required]]
如果你希望在输入时得到一些提示,可以这样写你的HTML:
<form [formGroup]="registerForm" (ngSubmit)="handleSubmit(registerForm)">
<label>FirstName:</label>
<input formControlName="firstName">
<p *ngIf="registerForm.controls.firstName.touched && registerForm.controls.firstName.invalid">
This field is required!
</p>
<label>LastName:</label>
<input formControlName="lastName">
<p *ngIf="registerForm.controls.lastName.hasError('pattern')">
Invalid input!
</p>
<button type="submit" [disabled]="!registerForm.valid">Submit</button>
</form>
第一个控件,在你“touch”过又为空的情况下会给出提示;第二个控件,在输入不符合正则表达式规则的情况下给出提示,hasError方法还可以传入required、minLength等参数,分别对应不同的验证器;最后,在输入还未符合规则的时候,Submit按钮是处于禁用状态的。
Angular提供的几个验证器在实际项目中往往是不够用的,因此我们需要自定义验证器,以满足我们的业务需求!
自定义验证器
验证器其实就是一个有着return的方法!
现在我们来写一个验证器,验证一个网址输入框的值是否符合规则:
export function validateUrl(control: AbstractControl){
if(control.value){
if(!control.value.startsWith('www') || !control.value.includes('.io')){
return {
inValidUrl: true
}
}
}
return null;
}
我们测试输入值是否以“www”开头,并且包含“.io”。然后使用方法跟Angular提供的验证器一样:
this.registerForm = this.fb.group({
firstName: ['', Validators.required],
lastName: ['', [Validators.pattern('[A-Za-z0-9]*'), Validators.required]],
website: ['', validateUrl], // <---
})
然后,如果你希望在输入不符合validateUrl验证器规则时得到提示,你可以这样写你的HTML:
<label>Website:</label>
<input formControlName="website">
<p *ngIf="registerForm.controls.website.hasError('inValidUrl')"> //<---
Url must starts with www and includes .io
</p>
hasError方法的参数就是validateUrl验证器返回对象的key。
OK,今天的内容就到这里。
Angular:Reactive Form的使用方法和自定义验证器的更多相关文章
- Flask系列09--Flask中WTForms插件,及自定义验证器
一.概述 django中的forms组件非常的方便,在flask中有WTForms的组件实现的也是类似的功能, 安装这个插件 二.简单使用 文档地址https://wtforms.readthedoc ...
- angular reactive form
这篇文章讲了angular reactive form, 这里是angular file upload 组件 https://malcoded.com/posts/angular-file-uploa ...
- Angular11 模板表单、响应式表单(自定义验证器)、HTTP、表单元素双向绑定
1 模板表单 模型通过指令隐式创建 技巧01:需要在模块级别引入 FormsModule ,通常在共享模块中引入再导出,然后在需要用到 FormsModule 的模块中导入共享模块就可以啦 impor ...
- flask 自定义验证器(行内验证器、全局验证器)
自定义验证器 在WTForms中,验证器是指在定义字段时传入validators参数列表的可调用对象,下面来看下编写自定义验证器. 行内验证器 除了使用WTForms提供的验证器来验证表单字段,我们还 ...
- Struts(二十五):自定义验证器
编程验证 Struts2提供了一个Validateable接口,可以使用Action类实现这个接口以提供编程验证: ActionSupport类已经实现了Validateable接口. public ...
- TP5 自定义验证器
TP内置验证功能提供两种验证方法 验证器(推荐) $validate = Validate::make([ 'id' => 'require|integer', ]); if ($validat ...
- thinkphp5.0自定义验证器
虽然我早就会些php基础语法,我套过数据,自己写的控制器层,不是用的api方式,那个公司是为了锻炼我,所以才那样做的,基本上的东西都是用的框架自带的,重来自己没有去封装过这些东西,所以编程思想上,还很 ...
- gin中如何自定义验证器
package main import ( "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding&qu ...
- 9、 Struts2验证(声明式验证、自定义验证器)
1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...
随机推荐
- 35 个 jQuery 小技巧
1. 禁止右键点击 $(document).ready(function(){ $(document).bind("contextmenu",function(e){ return ...
- MySQL体系结构及多实例
MySQL客户端和服务器端模型 MySQL是一个典型C/S,服务器端与客户端两部分组成 服务器端程序 mysqld mysql自带的客户端(mysql mysqladmin mysqldump等) ...
- 阶乘之和 输入n,计算S=1!+2!+3!+…+n!的末6位(不含前导0)。n≤10 6 ,n!表示 前n个正整数之积。
阶乘之和输入n,计算S=1!+2!+3!+…+n!的末6位(不含前导0).n≤10 6 ,n!表示前n个正整数之积.样例输入:10样例输出: package demo; import java.uti ...
- LNMP搭建环境遇到的N多坑
最近配置开发用的lnmp环境,环境配置完成后,爆500错误,查看nginx错误日志 open_basedir 将 PHP 所能打开的文件限制在指定的目录树,包括文件本身 错误日志显示,访问脚本不在 o ...
- 一不小心把Mysql数据库的root的账号的权限给弄没啦,该怎么办
别急啊,现在只要你还能连接到Mysql,就问题不大! 首先,连接道Mysql,这里用Navicat进行讲解. 说明:root@localhost和root@127.0.0.1不是一个账号,也不是一回事 ...
- nyoj358 取石子(五) 斐波那契博弈
我写代码找的规律:如果这个n是斐波那契数,那么它是P态,如2,3,5,8..... 找规律的代码: #include <cstdio> #include <cmath> #in ...
- 【BZOJ3309】DZY Loves Math
Time Limit: 5000 ms Memory Limit: 512 MB Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * ...
- 吾八哥学Selenium(一):Python下的selenium安装
selenium简介 Selenium也是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozilla Firefox.Mo ...
- 基于 HTML5 Canvas 的交互式地铁线路图
前言 前两天在 echarts 上寻找灵感的时候,看到了很多有关地图类似的例子,地图定位等等,但是好像就是没有地铁线路图,就自己花了一些时间捣鼓出来了这个交互式地铁线路图的 Demo,地铁线路上的点是 ...
- 自动化测试 selenium中WebDriver 和WebElement的区别
之前在做UI自动化测试中 经常会用到 WebDriver 和 WebElement两个类 以前对这两个类总感觉有点傻傻分不清 昨天看了下之前下的代码 结合自己的理解 对着两个类的区别和关系 ...