如何在 Angular 中为响应式表单创建自定义验证器

这篇具有很好参考价值的文章主要介绍了如何在 Angular 中为响应式表单创建自定义验证器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

Angular 的 @angular/forms 包提供了一个 Validators 类,支持诸如 requiredminLengthmaxLengthpattern 等有用的内置验证器。然而,可能存在需要更复杂或自定义规则进行验证的表单字段。在这种情况下,您可以使用自定义验证器。

在 Angular 中使用响应式表单时,您可以使用函数定义自定义验证器。如果验证器不需要被重复使用,它可以直接存在于组件文件中作为一个函数。否则,如果验证器需要在其他组件中重复使用,它可以存在于一个单独的文件中。

在本教程中,您将构建一个带有可重用自定义验证器的响应式表单,以检查 URL 是否符合特定条件。

先决条件

要完成本教程,您需要:

  • 在本地安装 Node.js,您可以按照《如何安装 Node.js 并创建本地开发环境》进行操作。
  • 一些关于设置 Angular 项目的基本知识。

本教程已经在 Node v15.2.1、npm v6.14.8、@angular/core v11.0.0 和 @angular/forms v11.0.0 下进行了验证。

步骤 1 – 设置项目

为了本教程的目的,您将从使用 @angular/cli 生成的默认 Angular 项目开始构建。

npx @angular/cli new angular-reactive-forms-custom-validtor-example --style=css --routing=false --skip-tests

这将配置一个新的 Angular 项目,其中样式设置为 “CSS”(而不是 “Sass”、“Less” 或 “Stylus”),没有路由,并且跳过了测试。

进入新创建的项目目录:

cd angular-reactive-forms-custom-validator-example

为了使用响应式表单,您将使用 ReactiveFormsModule 而不是 FormsModule

在代码编辑器中打开 app.module.ts 并添加 ReactiveFormsModule

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';

import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    ReactiveFormsModule,
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

到此为止,您应该已经拥有一个带有 ReactiveFormsModule 的新 Angular 项目。

步骤 2 – 构建自定义验证器

本教程的示例自定义验证器将接受一个 URL 字符串,并确保它以 https 协议开头并以 .io 顶级域名结尾。

首先,在您的终端中,创建一个 shared 目录:

mkdir src/shared

然后,在这个新目录中,创建一个新的 url.validator.ts 文件。在代码编辑器中打开此文件并添加以下代码:

import { AbstractControl } from '@angular/forms';

export function ValidateUrl(control: AbstractControl) {
  if (!control.value.startsWith('https') || !control.value.includes('.io')) {
    return { invalidUrl: true };
  }
  return null;
}

这段代码使用了 AbstractControl 类,它是 FormControlFormGroupFormArray 的基类。这允许访问 FormControl 的值。

这段代码将检查值是否以 https 字符串开头。它还将检查值是否包含 .io 字符串。

如果验证失败,它将返回一个带有错误名称 invalidUrl 和值 true 的对象。

否则,如果验证通过,它将返回 null

到此为止,您的自定义验证器已经准备就绪。

步骤 3 – 使用自定义验证器

接下来,创建一个表单,其中包含 userNamewebsiteUrl

打开 app.component.ts 并用以下代码替换内容:

import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';

import { ValidateUrl } from '../shared/url.validator';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  myForm: FormGroup;

  constructor(private fb: FormBuilder) {}

  ngOnInit() {
    this.myForm = this.fb.group({
      userName: ['', Validators.required],
      websiteUrl: ['', [Validators.required, ValidateUrl]]
    });
  }

  saveForm(form: FormGroup) {
    console.log('Valid?', form.valid); // true or false
    console.log('Username', form.value.userName);
    console.log('Website URL', form.value.websiteUrl);
  }
}

在这段代码中,websiteUrl 表单控件同时使用了内置的 Validators.required 和自定义的 ValidateUrl 验证器。

第四步 – 访问模板中的错误信息

与您的表单交互的用户需要了解哪些数值未通过验证。在组件模板中,您可以使用自定义验证器返回值中定义的键。

打开 app.component.html 并用以下代码替换内容:

<form [formGroup]="myForm" (ngSubmit)="saveForm(myForm)">
  <div>
    <label>
      用户名:
      <input formControlName="userName" placeholder="您的用户名">
    </label>
    <div *ngIf="(
                 myForm.get('userName').dirty ||
                 myForm.get('userName').touched
                ) &&
                myForm.get('userName').invalid"
    >
      请提供您的用户名。
    </div>
  </div>
  <div>
    <label>
      网站 URL:
      <input formControlName="websiteUrl" placeholder="您的网站">
    </label>
    <div
      *ngIf="(
              myForm.get('websiteUrl').dirty ||
              myForm.get('websiteUrl').touched
             ) &&
             myForm.get('websiteUrl').invalid"
      >
      仅接受通过 HTTPS 提供且来自 .io 顶级域的 URL。
    </div>
  </div>
</form>

此时,您可以编译您的应用程序:

npm start

然后在您的网络浏览器中打开它。您可以与 userNamewebsiteUrl 字段进行交互。确保您的 ValidateUrl 的自定义验证器对于应满足 https.io 条件的值(例如 https://example.io)能够正常工作。

结论

在本文中,您为 Angular 应用程序中的响应式表单创建了一个可重用的自定义验证器。

要了解模板驱动表单和响应式表单中自定义验证器的示例,请参阅 Angular 中的自定义表单验证。

如果您想了解更多关于 Angular 的知识,请查看我们的 Angular 主题页面,了解练习和编程项目。文章来源地址https://www.toymoban.com/news/detail-835383.html

到了这里,关于如何在 Angular 中为响应式表单创建自定义验证器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何在自定义 Angular 指令中使用 @HostBinding 和 @HostListener

    简介 @HostBinding 和 @HostListener 是 Angular 中两个在自定义指令中非常有用的装饰器。 @HostBinding 允许你在承载指令的元素或组件上设置属性,而 @HostListener 则允许你监听宿主元素或组件上的事件。 在本文中,你将会在一个示例指令中使用 @HostBinding 和 @HostListener 来监听宿主上的

    2024年02月22日
    浏览(37)
  • Angular表单

    案例来源于Angular官网(略作拓展) 通过指令 [formControl] 实现,直接访问 FormControl 实例 通过指令内部的值访问器 ControlValueAccessor ,将 FormControl 实例和视图中的表单元素联系起来。 通过 NgModel 指令为表单元素创建并管理 FormControl 实例,间接访问 FormControl 实例 响应式 模板驱

    2024年04月09日
    浏览(50)
  • angular表单的一些概念和方法

    UntypedFormGroup UntypedFormGroup 是一个类型安全的 FormGroup,它是一个表单控件容器,用于组织和管理一组表单控件 markAsPristine()  方法用于将 FormGroup 标记为 “pristine”(未修改)状态。这意味着表单控件的值没有被修改过。通常在表单提交后或者在重置表单时使用该方法来重置表

    2024年02月15日
    浏览(41)
  • 在uniapp中为自定义组件绑定点击事件点击后没有效果

    使用uniapp时,封装了一个Card的组件,为这个Card组件加上点击事件 @click=\\\"handleClick\\\"事件时,事件没有触发。 点开微信小程序生成后的源码,可以看到 @click的事件 变成bindClick 了。正确的点击事件应该是 bindtap ,如下图中view上面绑定事件。 这个时候可以修改组件上面的写法,

    2024年02月07日
    浏览(42)
  • 如何创建和填写 PDF 表单,简化您的文档工作流

    阅读本文,了解如何在开源办公套件 ONLYOFFICE 中创建和填写 PDF 表单。 ONLYOFFICE  表单 首个版本 发布于 2022 年 1 月 18 日,是   ONLYOFFICE 版本 7.0   更新的一部分 。 您可以使用 ONLYOFFICE   表单,创建 各种类型的 模板 文档 ,包括 法律协议、合同、报告、录取 表单 、 调查问卷

    2024年02月22日
    浏览(41)
  • 界面控件DevExpress ASP.NET中文 - 如何自定义编辑表单运行时布局?

    在DevExpress ASP.NET控件v19.2版本中就针对ASP. NET WebForms和MVC平台的ASP. NET GridView和CardView控件添加了一个主要增强功能。 DevExpress ASP.NET v23.1正式版下载 (Q技术交流:523159565) 当您使用预定义的或 自定义的编辑表单时,经常需要动态地更改布局。例如,您可能需要根据用户操作、

    2024年02月11日
    浏览(56)
  • 如何在fastadmin的html模板中,循环一段自定义表单模板代码?

    在FastAdmin的HTML模板中,可以使用模板引擎语法和JavaScript代码来实现自定义表单模板代码的循环。具体步骤如下: 在HTML模板中,定义一个占位符,用来显示循环后的自定义表单模板代码。例如: 在JavaScript代码中,获取自定义表单模板代码,并循环生成表单。具体代码如下所

    2024年02月02日
    浏览(38)
  • Angular中RxJS处理一些任务——HTTP请求,表单处理

            此篇是完善https://blog.csdn.net/qq_44327851/article/details/134917018这篇博客,在上篇博客中我们提到了处理异步数据流,那在Angular中有哪些异步数据流呢,又是如何处理的呢?         Angular中的RxJS是一个非常强大和流行的库, 用于处理异步数据流和事件流 。它提供了丰

    2024年02月03日
    浏览(49)
  • angular中多层嵌套结构的表单如何处理回显问题

    最近在处理angular表单时,有一个4层结构的表单。而且很多元素时动态生成,如下: 其界面表现如下: 、 而在编辑的状态时如何根据后端返回数据结构进行回显。angular中formbuilder对象提供了setValue和patchValue两个方法。这两个方法只对一层对象有效,对于多层嵌套的数据结构

    2024年02月09日
    浏览(39)
  • Angualr响应式表单

    由于最近公司框架升级,抛弃了原来手动检验表单的方式,将所有的表单改为响应式,由于之前没用过,在一开始我以为只有我没有用过,了解了小组里的其他同事得知基本都不是很熟悉 后面时间比较紧,没办法只能边做边学边改了,所以难免踩了一些坑,当然也花了一些时

    2024年01月20日
    浏览(90)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包