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
随机推荐
- 【Redis】基础命令
声明:本篇文章参考于该作者的# Redis从入门到精通:中级篇,大家有兴趣,去关注一下. 1.字符串(String) String(字符串)是Redis中最简单的一种数据结构,和MemCache数据结 ...
- Flutter系列文章-Flutter环境搭建和Dart基础
Flutter是Google推出的一个开源的.高性能的移动应用开发框架,可以用一套代码库开发Android和iOS应用.Dart则是Flutter所使用的编程语言.让我们来看看如何搭建Flutter开 ...
- 使用Hexo搭建个人博客网站
参考CSDN上的博客.特此感谢wsmrzx.
- Oracle备份与还原(实用版)
Oracle备份与还原 EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用. I ...
- ubuntu安装msf签名认证失败
添加命令 apt-get --allow-unauthenticated upgrade 来允许未认证签名软件安装,但是可能有恶意软件安装进来,可以使用 sudo apt-key adv --keys ...
- django.db.utils.OperationalError: (1366, "Incorrect string value: '\\xE5\\xA4\\xAB\\xE4\\xBA\\xBA' f
1.打开mysql命令行 show variables like '%char%'; 将字符集显示不是utf-8的更改为utf-8 例如:set character_set_database=utf8 ...
- Lora简介
断断续续接触lora已经有几年时间了,一直用lora来做点对点的传输,近来有朋友想通过Lora来做广播群发和群收管理,想通过低成本方式实现,sx1302几百的银子,成本有点高,尝试通过sx1278/L ...
- 学习OI两年我到底收获了什么
做一个小小的总结 学习了两年的代码,刚刚要进入高中,留下一点文字给以前的学习做一个总结. 命中注定の邂逅-- 这两年之间,和编程产生了比学习更为低调的羁绊关系(我觉得用这个词语比较合适).编程给我带来 ...
- [kubernetes]集群中部署CoreDNS服务
前言 从k8s 1.11版本开始,k8s集群的dns服务由CoreDNS提供.之前已经使用二进制文件部署了一个三master三node的k8s集群,现在需要在集群内部部署DNS服务. 环境信息 IP ...
- GitOps 与 DevOps:了解关键差异,为企业做出最佳选择
在软件开发领域,GitOps 和 DevOps 是加强协作和实现软件交付流程自动化的重要技术.虽然这两种模式都旨在提高软件开发生命周期的效率,但它们的核心原则和实施方式却各不相同. 本篇文章将帮助您了 ...