angular学习之浅析响应式表单

本篇文章带大家继续angular的学习,了解一下angular中的响应式表单,介绍一下全局注册响应式表单模块、添加基础表单控件的相关知识,希望对大家有所帮助!

angular学习之浅析响应式表单

响应式表单

Angular 提供了两种不同的方法来通过表单处理用户输入:响应式表单模板驱动表单。【相关教程推荐:《angular教程》】

响应式表单:提供对底层表单对象模型直接、显式的访问。它们与模板驱动表单相比,更加健壮。如果表单是你的应用程序的关键部分,或者你已经在使用响应式表单来构建应用,那就使用响应式表单。模板驱动表单:依赖模板中的指令来创建和操作底层的对象模型。它们对于向应用添加一个简单的表单非常有用,比如电子邮件列表注册表单。

这里只介绍响应式表单,模板驱动表单请参考官网:https://angular.cn/guide/forms-overview#setup-in-template-driven-forms

全局注册响应式表单模块 ReactiveFormsModule

要使用响应式表单控件,就要从 @angular/forms 包中导入 ReactiveFormsModule,并把它添加到你的 NgModuleimports数组中。如下:app.module.ts

/***** app.module.ts *****/import { ReactiveFormsModule } from '@angular/forms';@NgModule({  imports: [    // other imports ...    ReactiveFormsModule  ],})export class AppModule { }

添加基础表单控件 FormControl

使用表单控件有三个步骤。

在你的应用中注册响应式表单模块。该模块声明了一些你要用在响应式表单中的指令。

生成一个新的 FormControl 实例,并把它保存在组件中。

在模板中注册这个 FormControl

要注册一个表单控件,就要导入FormControl类并创建一个 FormControl的新实例,将其保存为类的属性。如下:test.component.ts

/***** test.component.ts *****/import { Component } from '@angular/core';import { FormControl } from '@angular/forms';@Component({  selector: 'app-name-editor',  templateUrl: './name-editor.component.html',  styleUrls: ['./name-editor.component.css']})export class TestComponent {// 可以在 FormControl 的构造函数设置初始值,这个例子中它是空字符串  name = new FormControl('');}

然后在模板中注册该控件,如下:test.component.html

name: {{ name.value }}

FormControl 的其它属性和方法,参阅 API 参考手册

https://angular.cn/api/forms/FormControl#formcontrol

把表单控件分组 FormGroup

就像FormControl 的实例能让你控制单个输入框所对应的控件一样,FormGroup 的实例也能跟踪一组 FormControl 实例(比如一个表单)的表单状态。当创建 FormGroup 时,其中的每个控件都会根据其名字进行跟踪。

看下例演示:test.component.tstest.component.html

import { Component } from '@angular/core';import { FormControl, FormGroup, Validators } from '@angular/forms'@Component({  selector: 'app-test',  templateUrl: './test.component.html',  styleUrls: ['./test.component.css']})export class TestComponent implements OnInit {    constructor() {}    profileForm = new FormGroup({      firstName: new FormControl('', [Validators.required,Validators.pattern('[a-zA-Z0-9]*')]),      lastName: new FormControl('', Validators.required),    });onSubmit() {// 查看控件组各字段的值      console.log(this.profileForm.value)    }}
                

{{ profileForm.value }}

{{ profileForm.status }}

{{ profileForm.valid }}

{{ profileForm.disabled }}

FormGroup 的其它属性和方法,参阅 API 参考手册

https://angular.cn/api/forms/FormGroup#formgroup

使用更简单的 FormBuilder 服务生成控件实例

在响应式表单中,当需要与多个表单打交道时,手动创建多个表单控件实例会非常繁琐。FormBuilder服务提供了一些便捷方法来生成表单控件。FormBuilder在幕后也使用同样的方式来创建和返回这些实例,只是用起来更简单。

FormBuilder 是一个可注入的服务提供者,它是由 ReactiveFormModule 提供的。只要把它添加到组件的构造函数中就可以注入这个依赖。

FormBuilder服务有三个方法:control()group()array()。这些方法都是工厂方法,用于在组件类中分别生成FormControlFormGroupFormArray

表单大师AI 表单大师AI

一款基于自然语言处理技术的智能在线表单创建工具,可以帮助用户快速、高效地生成各类专业表单。

表单大师AI 74 查看详情 表单大师AI

看下例演示:test.component.ts

import { Component } from '@angular/core';// 1、导入 FormBuilderimport { FormBuilder, Validators } from '@angular/forms';@Component({  selector: 'app-test',  templateUrl: './test.component.html',  styleUrls: ['./test.component.css']})export class TestComponent {// 2、注入 FormBuilder 服务    constructor(private fb: FormBuilder) { }    ngOnInit() { }    profileForm = this.fb.group({      firstName: ['', [Validators.required, Validators.pattern('[a-zA-Z0-9]*')]],      lastName: ['', Validators.required],    });    // 相当于    // profileForm = new FormGroup({    //   firstName: new FormControl('', [Validators.required,Validators.pattern('[a-zA-Z0-9]*')]),    //   lastName: new FormControl('', Validators.required),    // });    onSubmit() {      console.log(this.profileForm.value)      console.log(this.profileForm)    }}

对比可以发现,使用FormBuilder服务可以更方便地生成FormControlFormGroupFormArray,而不必每次都手动new一个新的实例出来。

表单验证器 Validators

Validators类验证器的完整API列表,参考API手册

https://angular.cn/api/forms/Validators

验证器(Validators)函数可以是同步函数,也可以是异步函数。

同步验证器:这些同步函数接受一个控件实例,然后返回一组验证错误或 null。你可以在实例化一个 FormControl 时把它作为构造函数的第二个参数传进去。异步验证器 :这些异步函数接受一个控件实例并返回一个 PromiseObservable,它稍后会发出一组验证错误或 null。在实例化 FormControl 时,可以把它们作为第三个参数传入。

出于性能方面的考虑,只有在所有同步验证器都通过之后,Angular 才会运行异步验证器。当每一个异步验证器都执行完之后,才会设置这些验证错误。

验证器Validators类的API

https://angular.cn/api/forms/Validators

class Validators {  static min(min: number): ValidatorFn// 允许输入的最小数值  static max(max: number): ValidatorFn// 最大数值  static required(control: AbstractControl): ValidationErrors | null// 是否必填  static requiredTrue(control: AbstractControl): ValidationErrors | null  static email(control: AbstractControl): ValidationErrors | null// 是否为邮箱格式  static minLength(minLength: number): ValidatorFn// 最小长度  static maxLength(maxLength: number): ValidatorFn// 最大长度  static pattern(pattern: string | RegExp): ValidatorFn// 正则匹配  static nullValidator(control: AbstractControl): ValidationErrors | null// 什么也不做  static compose(validators: ValidatorFn[]): ValidatorFn | null  static composeAsync(validators: AsyncValidatorFn[]): AsyncValidatorFn | null}

内置验证器函数

要使用内置验证器,可以在实例化FormControl控件的时候添加

import { Validators } from '@angular/forms';...ngOnInit(): void {  this.heroForm = new FormGroup({  // 实例化 FormControl 控件    name: new FormControl(this.hero.name, [      Validators.required,// 验证,必填      Validators.minLength(4),// 长度不小于4      forbiddenNameValidator(/bob/i) // 自定义验证器    ]),    alterEgo: new FormControl(this.hero.alterEgo),    power: new FormControl(this.hero.power, Validators.required)  });}get name() { return this.heroForm.get('name'); }get power() { return this.heroForm.get('power'); }

自定义验证器

自定义验证器的内容请参考API手册

https://angular.cn/guide/form-validation

有时候内置的验证器并不能很好的满足需求,比如,我们需要对一个表单进行验证,要求输入的值只能为某一个数组中的值,而这个数组中的值是随程序运行实时改变的,这个时候内置的验证器就无法满足这个需求,需要创建自定义验证器。

在响应式表单中添加自定义验证器。在上面内置验证器一节中有一个forbiddenNameValidator函数如下:

import { Validators } from '@angular/forms';...ngOnInit(): void {  this.heroForm = new FormGroup({    name: new FormControl(this.hero.name, [      Validators.required,      Validators.minLength(4),      // 1、添加自定义验证器      forbiddenNameValidator(/bob/i)    ])  });}// 2、实现自定义验证器,功能为禁止输入带有 bob 字符串的值export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {  return (control: AbstractControl): ValidationErrors | null => {    const forbidden = nameRe.test(control.value);    // 3、在值有效时返回 null,或无效时返回验证错误对象    return forbidden ? {forbiddenName: {value: control.value}} : null;  };}

验证器在值有效时返回 null,或无效时返回验证错误对象。 验证错误对象通常有一个名为验证秘钥(forbiddenName)的属性。其值为一个任意词典,你可以用来插入错误信息({name})。

在模板驱动表单中添加自定义验证器。要为模板添加一个指令,该指令包含了 validator 函数。同时,该指令需要把自己注册成为NG_VALIDATORS的提供者。如下所示:

// 1、导入相关类import { NG_VALIDATORS, Validator, AbstractControl, ValidationErrors } from '@angular/forms';import { Input } from '@angular/core'@Directive({  selector: '[appForbiddenName]',  // 2、注册成为 NG_VALIDATORS 令牌的提供者  providers: [{provide: NG_VALIDATORS, useExisting: ForbiddenValidatorDirective, multi: true}]})export class ForbiddenValidatorDirective implements Validator {  @Input('appForbiddenName') forbiddenName = '';  // 3、实现 validator 接口,即实现 validate 函数  validate(control: AbstractControl): ValidationErrors | null {  // 在值有效时返回 null,或无效时返回验证错误对象    return this.forbiddenName ? forbiddenNameValidator(new RegExp(this.forbiddenName, 'i'))(control)                              : null;  }}// 4、自定义验证函数export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {  return (control: AbstractControl): ValidationErrors | null => {    const forbidden = nameRe.test(control.value);    // 3、在值有效时返回 null,或无效时返回验证错误对象    return forbidden ? {forbiddenName: {value: control.value}} : null;  };}

注意,自定义验证指令是用 useExisting 而不是 useClass 来实例化的。如果用useClass来代替 useExisting,就会注册一个新的类实例,而它是没有forbiddenName 的。


更多编程相关知识,请访问:编程入门!!

以上就是angular学习之浅析响应式表单的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/552496.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月9日 20:42:54
下一篇 2025年11月9日 20:43:34

相关推荐

  • css响应式表单控件样式优化方法

    响应式表单控件样式优化通过CSS重置、媒体查询、灵活布局和可访问性增强,在不同设备上实现一致且易用的体验,核心是平衡一致性与适应性。 响应式表单控件样式优化旨在让表单在不同设备上看起来美观且易于使用,核心在于利用CSS媒体查询和灵活的布局技术,提升用户体验。 解决方案 标准化基础样式: 首先,重置浏…

    2025年12月2日 web前端
    000
  • css响应式表单输入框自适应宽度

    响应式表单输入框自适应宽度可通过百分比、vw单位、flex-grow、calc()等方法实现,结合max-width、min-width和box-sizing确保布局合理;处理文本溢出可用text-overflow或word-wrap;兼容性问题可通过Autoprefixer、Normalize.c…

    2025年12月2日 web前端
    000
  • css响应式表单输入框布局优化

    使用Flexbox和媒体查询实现响应式表单布局,通过flex-wrap、gap和min-width控制换行与间距,结合width:100%和box-sizing确保自适应填充,利用@media在768px等断点调整flex-direction为column以适配移动端,同时设置统一高度、placeh…

    2025年12月2日 web前端
    000
  • css响应式表单标签与输入框对齐方法

    使用Flexbox、Grid、响应式断点和CSS自定义属性可实现标签与输入框对齐,提升响应式表单体验。 在响应式表单设计中,标签与输入框的对齐直接影响用户体验。不同屏幕尺寸下保持良好的视觉结构和操作便利性,是前端开发中的常见需求。以下是几种实用的 CSS 方法,帮助你实现标签与输入框的整齐对齐。 1…

    2025年12月1日 web前端
    000
  • 如何在CSS中实现响应式表单布局_Flex/Grid与百分比结合

    响应式表单布局通过Flexbox、Grid和百分比宽度实现多设备适配。1. 使用Flexbox的flex-wrap和flex属性使表单项在小屏堆叠、大屏并排;2. 采用CSS Grid的grid-template-columns与minmax结合auto-fit自动调整列数,适应不同屏幕;3. 设置…

    2025年12月1日 web前端
    000
  • 聊聊Angular中怎么将迁移tslint至eslint

    本篇文章带大家继续angular的学习,对比一下tslint和eslint,介绍一下angular中怎么将迁移tslint至eslint,希望对大家有所帮助! 大家好,最近做了Angular从12到13的升级,官方自动把angular.json中的tslint配置去除了,那么咱也最好遵从官方安排用起…

    2025年11月27日 web前端
    000
  • Angular学习之以Tooltip为例了解自定义指令

    本篇文章带大家继续angular的学习,以tooltip为例来了解一下自定义指令,希望对大家有所帮助! 在之前的文章中,我们已经概览了 Angular 的相关内容。在自定义指令的部分,我们已经能够实现编写,但是,在实际场景中,我们还需要标准化的管理。 Angular 是 Angular.js 的升版…

    2025年11月27日 web前端
    000
  • Angular如何进行视图封装?聊聊三种封装模式

    angular如何进行视图封装?下面本篇文章给大家深入了解一下angular encapsulation的三种方式,希望对大家有所帮助! 在日常工作中,当我们定义一个Component的时候,要考虑它的encapsulation封装性,也就是说你期望这个组件里定义的样式是只作用于这个组件,还是想作用…

    2025年11月27日 web前端
    100
  • 聊聊Angular+Service如何改进日志功能

    如何改善angular的日志使用方式?下面本篇文章给大家介绍一下使用angular中的service管理控制台输出,改进日志功能的方法,希望对大家有所帮助! 改善在Angular 应用中的日志使用方式 Angular是一个非常受欢迎的开发框架,前端开发者们喜欢在应用中使用console去调试它们的代…

    2025年11月10日 web前端
    100
  • 带你了解Angular中的组件通讯和依赖注入

    angular组件间怎么进行通讯?依赖注入是什么?下面本篇文章带大家简单了解一下组件通讯的方法,并介绍一下依赖注入,希望对大家有所帮助! 1.  组件通讯 1.1  向组件内部传递数据 // favorite.component.tsimport { Input } from ‘@angular/c…

    2025年11月10日 web前端
    300
  • angular如何引入css

    angular引入css的方法:1、在ts文件中设置“@Component({styleUrls:[‘css文件路径’]})”语句;2、在ts文件中设置“@Component({styles:[`css样式代码`]})”语句。 本教程操作环境:windows7系统、angul…

    2025年11月10日 web前端
    100
  • 聊聊Angular中NgTemplateOutlet指令的理解和用法

    本篇文章带大家了解一下angular中ngtemplateoutlet指令,介绍一下ngtemplateoutlet这个结构性指令的理解与应用,希望对大家有所帮助! 最近在看一个培训项目的时候有看到这个NgTemplateOutlet这个结构性指令,但是我之前没接触过,不知道这东西是怎么用的,然后,…

    2025年11月10日 web前端
    100
  • 一起聊聊angular的样式隔离实现机制

    angular是怎么进行样式隔离的?下面本篇文章就来和大家一起聊聊angular的样式隔离实现机制,希望对大家有所帮助! angular 以组件为基本单位。我们编写一个一个的组件,再将这些组件组合为一颗组件树。但是在开发的过程中,经常需要在父组件中覆盖子组件的样式。比如现在我们有一个parent 组…

    2025年11月9日 web前端
    000
  • 浅析Angular+rxjs怎么实现拖拽功能?

    angular+rxjs怎么实现拖拽功能?下面本篇文章给大家介绍一下angular 结合 rxjs 实现拖拽的方法,希望对大家有所帮助! 在之前的文章,我们学习了 Angular 中自定义 Video 操作,没有度过的读者可先了解。 现在有这么一个需求,你会怎么实现呢? 页面中 video 标签,当…

    2025年11月9日 web前端
    000
  • Angular知识点分享:聊聊表单、管道、绑定、指令、通信和周期

    本篇文章给大家分享angular的一些知识点,介绍一下angular的两表单(模板驱动表单和响应式表单)、三管道(内置管道、链式管道、自定义管道)、三绑定、三指令、五通信、八周期,希望对大家有所帮助! 1 Angular的两大表单 1.1 模板驱动表单 ? 模板驱动表单:引入FormsModule模…

    2025年11月9日 web前端
    000
  • angular学习之聊聊指令和管道

    本篇文章带大家了解一下angular中的指令(directive)和管道(pipe),简单介绍一下相关知识点:内置指令和自定义指令,内置管道和自定义管道,希望对大家有所帮助! 指令 Directive 指令是 Angular 提供的操作 DOM 的途径。指令分为属性指令和结构指令。 属性指令:修改现…

    2025年11月9日 web前端
    100
  • angular学习之聊聊组件通讯和组件生命周期

    本篇文章带大家了解一下angular中的组件通讯和组件生命周期,简单介绍一下向组件内部传递数据、组件向外部传递数据的方法,希望对大家有所帮助! 组件通讯 1、向组件内部传递数据 // favorite.component.tsimport { Input } from ‘@angular/core’…

    2025年11月9日 web前端
    100
  • 什么是装饰器?聊聊Angular中怎么使用方法装饰器?

    什么是装饰器?本篇文章给大家介绍一下angular中使用方法装饰器的方法,希望对大家有所帮助! 方法装饰器并不是 Angular 的专属特性,在 es6 中也有着这种特性,本文主要是介绍 方法装饰器 在 Angular 中的使用。【相关教程推荐:《angular教程》】 什么是装饰器 在es6中,装…

    2025年11月9日 web前端
    000
  • 浅析Angular中的独立组件,看看怎么使用

    本篇文章带大家了解一下angular中的独立组件,看看怎么在angular中创建一个独立组件,怎么在独立组件中导入已有的模块,希望对大家有所帮助! Angular 14一项令人兴奋的特性就是Angular的独立组件终于来了。 在Angular 14中, 开发者可以尝试使用独立组件开发各种组件,但是值…

    2025年11月9日 web前端
    000
  • 聊聊Angular Route中怎么提前获取数据

    angular route中怎么提前获取数据?下面本篇文章给大家介绍一下从 angular route 中提前获取数据的方法,希望对大家有所帮助! 提前获取意味着在数据呈现在屏幕之前获取到数据。本文中,你将学到,在路由更改前怎么获取到数据。通过本文,你将学会使用 resolver, 在 Angula…

    2025年11月9日 web前端
    000

发表回复

登录后才能评论
关注微信