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
随机推荐
- AIGC:新AI时代,推动数字人进化的引擎
摘要:CV.NLP.大模型...AI技术的加持下,让数字人内外在更加生动真实.在未来的发展中,数字人的应用场景越来越广泛,并将发挥出重要的作用,让美好照进生活. 本文分享自华为云社区<AIGC: ...
- MiniNK WEB 选拔题 by F12
Start 除了梦想外一无所有的我们,将会和蔑视与困境做最后的斗争,这是最后一舞 N0wayBack 联合战队成立以来一直致力于信息安全技术的研究,作为联合战队活跃在各大 CTF (信息安全竞赛)赛事 ...
- DevOps | 产研协同效能提升之评审、审批流、质量卡点
研发过程中有各种需求的评审.审批流和质量卡点,有的是为了质量把关,有的是为了彰显权力,还有一些是为了信息告知.本文主要讨论在软件开发过程中涉及的评审.审批和质量卡点三种情况,同时探讨对研发流程的影响, ...
- Spring-Bean(二)
环境在spring-Bean(一)的配置下 https://www.cnblogs.com/doubleconquer/p/15603706.html 来查看ApplicationContext的执行 ...
- 输入平方米的三种方式㎡ m2 m²
如何在Word中输入平方米字符? 第1种方法 Win10自带输入法,输入"平方米",默认第5个就出来了㎡,也可以直接复制使用. 这种方式最直接,字母m和右上角的2是1个字符,所以不 ...
- 【go语言】1.1.1 Go 语言的历史和背景
Go 语言,也被称为 Golang,是一种静态强类型.编译型的开源编程语言.Go 语言的出现是为了解决当下的软件开发问题,特别是大规模软件系统的开发. Go 语言的设计者包括 Robert Gries ...
- 文心一言 VS 讯飞星火 VS chatgpt (68)-- 算法导论6.5 7题
文心一言 VS 讯飞星火 VS chatgpt (68)-- 算法导论6.5 7题 七.试说明如何使用优先队列来实现一个先进先出队列,以及如何使用优先队列来实现栈(队列和栈的定义见 10.1 节.) ...
- CF1601 题解
偶然看这一场的题目,忽然很有感觉,于是写了一下 A 题面 考虑每一位可以单独分开考虑 考虑单独的一位,每次要选 \(m\) 个位置,可能产生贡献的位置就是这位为 1 的数,设数量为 \(x\),则 \ ...
- cesium中文网
http://cesium.xin/cesium/cn/Documentation1.62/CallbackProperty.html
- 为什么 API 治理需要内部倡导
API 治理旨在帮助人们通过 API 实现最大价值.但是,只有了解 API 是什么以及 API 的重要性,并且认识到 API 治理是在帮助他们而不是监管他们,才能实现这一目标.这就是为什么在任何 AP ...