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
随机推荐
- 公网环境部署zabbix5.0
实验环境 虚拟机两台,一台公网地址为 1.1.1.1,部署 zabbix server,一台公网地址为 1.1.1.2,部署 zabbix proxy,系统为centos7.2. 1 zabbix s ...
- 使用Docker安装Apollo并使用SpringBoot连接配置中心
上篇文章我们学习了Apollo的本地安装,如果还不会本地安装的朋友可以查看之前的文章进行了解和学习链接地址(https://www.cnblogs.com/eternality/p/17583023. ...
- UPS设备在物流机房中的应用浅析
1 UPS 简介 UPS 即不间断电源 (Uninterruptible Power Supply),是一种含有储能装置的不间断电源.主要用于给部分对电源稳定性要求较高的设备,提供不间断的电源. 当市 ...
- F-Beta-Score
F1-Score相关概念 F1分数(F1 Score),是统计学中用来衡量二分类(或多任务二分类)模型精确度的一种指标.它同时兼顾了分类模型的准确率和召回率. F1分数可以看作是模型准确率和召回率的一 ...
- 快速掌握Vue3:速成Vue3前端开发看这篇就够啦
一.Vue基本概念 1.1-Vue3的优点 Vue3支持Vue2额大多数特性. 更好的支持TypeScript. 打包大小减少41%. 初次渲染快55%,更新渲染快133%. 内存减少54%. 使用p ...
- 用React仿钉钉审批流
引言 这几天帮朋友忙,用了一周时间,高仿了一个钉钉审批流.这个东西会有不少朋友有类似需求,就分享出来,希望能有所帮助.为了方便朋友的使用,设计制作的时候,尽量做到节点配置可定制,减少集成成本.如果您的 ...
- grub加密与解密
前言 grub默认无加密,用户可免密以单用户模式进入系统修改root密码.若想增强其安全性,可以将grub加密. GRUB2提供两种类型的密码保护: 修改菜单条目时需要密码,但启动菜单条目时不需要密码 ...
- 干了这么多年C#,后悔没早点用这种“分页”,简单/高效/易维护
[前言] 干了这么多年C#,后悔没早点用这种"分页",简单/高效/易维护,比其它的分页方式强多了,不信你自己看. [正文] 支持.Net Core(2.0及以上)与.Net Fra ...
- ctfshow--web入门--XXE
ctfshow--web入门--XXE web373 源码 <?php error_reporting(0); libxml_disable_entity_loader(false); //允许 ...
- 带你上手基于Pytorch和Transformers的中文NLP训练框架
本文分享自华为云社区<全套解决方案:基于pytorch.transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据>,作者: 汀丶 . 1.简介 目标: ...