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)分别进行验证的更多相关文章

  1. Angular : 响应式编程, 组件间通信, 表单

    Angular 响应式编程相关 ------------------------------------------------------------------------------------ ...

  2. [转帖]浅谈响应式编程(Reactive Programming)

    浅谈响应式编程(Reactive Programming) https://www.jianshu.com/p/1765f658200a 例子写的非常好呢. 0.9312018.02.14 21:22 ...

  3. [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 ...

  4. angular 响应式表单指令

    响应式表单都是以 form开头的指令 第一列指令(不以name结尾)在html模版中,用 [ ] 第二列指令(以name结尾)在html模版中,不用 [ ]

  5. 响应式编程(Reactive Programming)(Rx)介绍

    很明显你是有兴趣学习这种被称作响应式编程的新技术才来看这篇文章的. 学习响应式编程是很困难的一个过程,特别是在缺乏优秀资料的前提下.刚开始学习时,我试过去找一些教程,并找到了为数不多的实用教程,但是它 ...

  6. angular响应式编程

    1.响应式编程 例子import {Observable} from "rxjs/Observable"; Observable.from([1,2,3,4]) .filter(( ...

  7. JVM平台上的响应式流(Reactive Streams)规范

    // Reactive Streams // 响应式流是一个倡议,用来为具有非阻塞后压的异步流处理提供一个标准.大家努力的目标集中在运行时环境(JVM和JavaScript)和网络协议上. 注:响应式 ...

  8. 函数式响应式编程 - Functional Reactive Programming

    我们略过概念,直接看函数式响应式编程解决了什么问题. 从下面这个例子展开: 两个密码输入框,一个提交按钮. 密码.确认密码都填写并一致,允许提交:不一致提示错误. HTML 如下: <input ...

  9. angular 响应式自定义表单控件—注册头像实例

    1. 组件继承ControlValueAccessor,ControlValueAccessor接口需要实现三个必选方法 writeValue() 用于向元素中写入值,获取表单的元素的元素值 regi ...

  10. angular响应式表单 - 状态字段

    用于表单验证的过程: touched,untoched pristine,dirty pending

随机推荐

  1. 【ssh】SSH连接远程主机的两种方式

    一.基于用户名与密码连接 指令 ssh username@server_ip 随后要求输入密码 加密流程 1️⃣ 在SSH连接建立过程中,客户端和服务器使用Diffie-Hellman密钥交换协议协商 ...

  2. react项目中使用plop

    第一步,安装依赖 npm install plop --dev //或者用yarn yarn add plop --dev 第二步,在package同级目录下新建plopfile.js 这是plop的 ...

  3. 我用WebGL打造了一款动态壁纸

    我用WebGL打造了一款动态壁纸 简述 最近在给自己电脑换壁纸的时候发现了一张很有特点的图(就是下面这张),于是我突发奇想,要是能把这张图变成一张动态的壁纸.那该多好.于是我打算用threejs开发一 ...

  4. React报错:Module not found: Error: Can't resolve 'react-router-dom'

    解决方案 npm install -S react-router-dom@5 参考链接 https://stackoverflow.com/questions/53914013/failed-to-c ...

  5. pycharm: 注释自动生成

    解决方案如下

  6. 从浅入深了解.NET Core MVC 2.x全面教程【第二章】

    二.Logging 1.诊断中间件 命名空间:Microsoft.AspNetCore.Diagnostics 报告信息并处理异常 2.诊断中间件 UseDeveloperExceptionPage: ...

  7. __wakeup()魔术方法绕过(CVE-2016-7124)

    __wakeup()魔术方法绕过(CVE-2016-7124) 漏洞简介 在php反序列化数据过程中,如果类中存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方 ...

  8. 带你快速上手HetuEngine

    本文分享自华为云社区<[手把手带你玩转HetuEngine](一)HetuEngine快速上手>,作者:HetuEngine九级代言. HetuEngine是什么 HetuEngine是华 ...

  9. Django+anaconda(spyder)

    一.搭建django虚拟环境 打开anaconda prompt 输入:conda create -n mydjango_env 判断(y/n):y 查看虚拟环境 conda env list *号表 ...

  10. django配置swagger自动生成接口文档以及自定义参数设置

    首先安装swagger所用的包 pip install drf-yasg 然后再settings.py 中注册app 接口采用的token认证,在settings.py配置认证方式 SWAGGER_S ...