angular:响应式表单(Reactive Forms)和模板驱动表单(Template-Driven Forms)分别进行验证
2022-01-18
响应式表单
响应式表单是围绕Observable的流构建的。
使用响应式表单时,FormControl类是最基本的构造类。
在使用响应式表单前,需要先导入 ReactiveFormsModule 并添加到 NgModule里。
html:
<!-- 响应式表单 -->
<form [formGroup]="reactiveForm">
<p>
<mat-form-field>
<mat-label>Name</mat-label>
<input matInput placeholder="Name" formControlName="name" [matTooltip]="name.errors?.['msg']">
</mat-form-field>
</p>
<button mat-stroked-button color="primary" [disabled]="reactiveForm.valid"
(click)="onSubmit()">Primary</button>
</form>
ts:
import { Component, OnInit } from '@angular/core';
// 响应式表单
import { FormGroup, FormControl, FormBuilder, Validators } from '@angular/forms';
import { nameValidator } from './form.directive';
@Component({
selector: 'app-form',
templateUrl: './form.component.html',
styleUrls: ['./form.component.less']
})
export class FormComponent implements OnInit {
reactiveForm!: FormGroup;
constructor(
private fb: FormBuilder
) { }
ngOnInit(): void {
// 响应式表单
this.reactiveForm = this.fb.group({
name: ['', [Validators.required, nameValidator()]]
});
}
get name() { return this.reactiveForm.get('name'); }
onSubmit() {
console.log(this.reactiveForm);
console.log(this.reactiveForm.value);
}
}
directive.ts
import { AbstractControl, ValidationErrors, ValidatorFn } from "@angular/forms";
export function nameValidator(): ValidatorFn {
return (control: AbstractControl): ValidationErrors | null => {
// 验证由数字、英文字母或者下划线组成的字符串:^\w+$
let nameRe = /^\w+$/;
const isTrue = nameRe.test(control.value);
return !isTrue ? { msg: "仅支持数字、英文字母或者下划线" } : null;
};
}
模板驱动表单
使用表单指令和技术来进行构建表单。
使用ngModel创建双向数据的绑定,进行读取和写入控件值。
在表单输入控件上添加name属性,用途是有效性验证和追踪表单元素的变更。
可以在form中可以使用ngForm声明一个模板变量,例如#heroForm="ngForm"。NgForm可以用来控制带有NgModel指令和name属性的元素。
在使用模板驱动表单钱,需要先导入FormsModule。
响应式表单和模板驱动表单的不同点:
响应式表单使用 Observable 流进行数据追踪;
模板驱动表单依赖嵌入模板中的指令并借助数据进行异步追踪;
使用模板绑定语法,把该表单控件注册给了模板中名为name的输入元素。
html:
<!-- 模板表单 -->
<form #ReactiveForm="ngForm">
<mat-form-field appearance="fill">
<mat-label>Name</mat-label>
<input matInput placeholder="Name" name="name" ngModel #name="ngModel" nameValidator
appForbiddenName="admin" [matTooltip]="name.errors?.['msg']">
</mat-form-field>
</form>
directive.ts
// 自定义指令
@Directive({
selector: '[nameValidator]',
providers: [{
provide: NG_VALIDATORS, // 带有可扩展验证器集合的预定义提供者
useExisting: nameValidatorDirective,
multi: true //想让一个控件同时支持多个验证器
}]
})
export class nameValidatorDirective implements Validator {
@Input('appForbiddenName') forbiddenName = '';
validate(control: AbstractControl): ValidationErrors | null {
let nameRe = /^\w+$/;
const isTrue = nameRe.test(control.value);
console.log(isTrue);
console.log(this.forbiddenName);
// console.log(control);
return !isTrue ? { msg: "仅支持数字、英文字母或者下划线" } : null;
}
}
module.ts
import { NgModule } from '@angular/core';
import { CommonModuleModule } from "../common-module/common-module.module";
import { FormRoutingModule } from './form-routing.module';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { FormComponent } from './form.component';
import { nameValidatorDirective } from './form.directive'
@NgModule({
imports: [
CommonModuleModule,
FormRoutingModule,
ReactiveFormsModule,
FormsModule
],
declarations: [
FormComponent,
nameValidatorDirective
],
entryComponents: [
],
providers: [
]
})
export class FormModule { }
angular:响应式表单(Reactive Forms)和模板驱动表单(Template-Driven Forms)分别进行验证的更多相关文章
- Angular : 响应式编程, 组件间通信, 表单
Angular 响应式编程相关 ------------------------------------------------------------------------------------ ...
- [转帖]浅谈响应式编程(Reactive Programming)
浅谈响应式编程(Reactive Programming) https://www.jianshu.com/p/1765f658200a 例子写的非常好呢. 0.9312018.02.14 21:22 ...
- [Angular] Create a custom validator for template driven forms in Angular
User input validation is a core part of creating proper HTML forms. Form validators not only help yo ...
- angular 响应式表单指令
响应式表单都是以 form开头的指令 第一列指令(不以name结尾)在html模版中,用 [ ] 第二列指令(以name结尾)在html模版中,不用 [ ]
- 响应式编程(Reactive Programming)(Rx)介绍
很明显你是有兴趣学习这种被称作响应式编程的新技术才来看这篇文章的. 学习响应式编程是很困难的一个过程,特别是在缺乏优秀资料的前提下.刚开始学习时,我试过去找一些教程,并找到了为数不多的实用教程,但是它 ...
- angular响应式编程
1.响应式编程 例子import {Observable} from "rxjs/Observable"; Observable.from([1,2,3,4]) .filter(( ...
- JVM平台上的响应式流(Reactive Streams)规范
// Reactive Streams // 响应式流是一个倡议,用来为具有非阻塞后压的异步流处理提供一个标准.大家努力的目标集中在运行时环境(JVM和JavaScript)和网络协议上. 注:响应式 ...
- 函数式响应式编程 - Functional Reactive Programming
我们略过概念,直接看函数式响应式编程解决了什么问题. 从下面这个例子展开: 两个密码输入框,一个提交按钮. 密码.确认密码都填写并一致,允许提交:不一致提示错误. HTML 如下: <input ...
- angular 响应式自定义表单控件—注册头像实例
1. 组件继承ControlValueAccessor,ControlValueAccessor接口需要实现三个必选方法 writeValue() 用于向元素中写入值,获取表单的元素的元素值 regi ...
- angular响应式表单 - 状态字段
用于表单验证的过程: touched,untoched pristine,dirty pending
随机推荐
- 行行AI人才直播第10期:CTC智仝咨询联合创始人王发鑫《AI时代职场进阶之路——资深猎头的职场洞见》
当今AI技术正在快速渗透各个行业,从去年热门的AIGC到今年爆火的ChatGPT,人工智能高速发展让人惊叹的同时,也让"算法取代人类"."AI或带来失业潮"等老 ...
- 聊聊又拍云存储 S3 协议的使用
近期,有细心的同学发现,在又拍云控制台中的云存储产品中增加了针对 S3 协议标准的兼容支持,授权用户通过 S3 协议标准对存储空间的数据进行读写操作.此配置操作之前是由人工协助的方式提供给用户使用的, ...
- 使用调试工具调试博图TCP连接所遇到的问题
PLC端使用的指令 PLC为服务器端,电脑为客户端,以上为服务器与客户端的配置参数 启动连接后连接成功,PLC的IP地址也可以ping通 ------------------------------- ...
- Angular报错:Error: Unknown argument: spec
解决方案 使用--skip-tests代替 效果展示 可以看到spec.ts消失了 参考链接 https://stackoverflow.com/questions/62228834/angular- ...
- 记一次 .NET 某物流API系统 CPU爆高分析
一:背景 1. 讲故事 前段时间有位朋友找到我,说他程序CPU直接被打满了,让我帮忙看下怎么回事,截图如下: 看了下是两个相同的程序,既然被打满了那就抓一个 dump 看看到底咋回事. 二:为什么会打 ...
- 修复grub分区
修复grub分区 实验环境:grup.cfg文件丢失,引导出错 1,删除grup.cfg配置文件 2,重启虚拟机 3,重启进入救援模式 再读进度条的时候快速点击Esc键 选着光驱或者u盘启动
- [ansible]wget批量调用shell脚本
前言 相较于使用playbook,个人更习惯于编写shell脚本.如果需要多台服务器执行某一任务,可以将脚本放在某个http服务目录下,比如nginx,然后通过ansible的shell模块让服务器通 ...
- 推荐工具!使终端便于 DevOps 和 Kubernetes 使用
如果你熟悉 DevOps 和 Kubernetes 的使用,就会知道命令行界面(CLI)对于管理任务有多么重要.好在现在市面上有一些工具可以让终端在这些环境中更容易使用.在本文中,我们将探讨可以让工作 ...
- wineqq中接收文件的查看与移动
在Ubuntu等linux系统中安装QQ都需要安装wine支持,而在使用时,会遇到qq接收到的文件无法直接进行操作等问题. 这时,我们发现直接对文件进行复制后,无法在Ubuntu目录中进行粘贴. 其实 ...
- FastJson不成想还有个版本2啊:序列化大字符串报错
背景 发现陷入了一个怪圈,写文章的话,感觉只有大bug或比较值得写的内容才会写,每次一写就是几千字,争取写得透彻一些,但这样,我也挺费时间,读者也未必有这么多时间看. 我想着,日常遇到的小bug.平时 ...