[分享]如何使用Angular中的自定义校验器

2023-11-17

在Angular的开发中表单是必不可少的,由此引出的表单校验也是万万不可缺少的。
解决方法一:
        全部使用ngModel 双向绑定数据,在最后的submit点击时进行所有表单的校验。这样做固然没有什么问题,而且代码写的也和我们之前使用jQuery获取每个id的value一样轻松,唯一的缺点就是缺乏及时的给用户提示,提示哪里没有填写,哪里填写错了,降低了用户系统体验。

解决方法二:
         使用Angular原生的FormControl和FormGroup来组织表单,同时加入系统自带的Validators.required等原生检验器可以满足大部分需求,但是例如 “如何确定checkbox-group中至少要选中一个”这样的校验需求。

这就引入了我们今天的主题:如何创建一个自定义校验器

通过浏览Angular官方文档和源码:

export interface Validator {
    validate(c: AbstractControl): ValidationErrors | null;
    registerOnValidatorChange?(fn: () => void): void;
}

我们需要实现Validator这个接口,并且实现其中的validate方法。

validate方法返回的是ValidationErrors | null , 返回null 就是校验成功,返回Errors 对象就代表还是有瑕疵。

我们可以看出validate方法接受的参数c 是 AbstractControl 类型的,说明接受的就是FormControl 或者 FormGroup 表单类,我们也都知道FormControl 代表单一的输入字段,它是Angular表单中的最小单元。

FormControl封装了这些字段的值和状态,比如是否有效、是否脏(被修改过)或是否有错误等。

看到这里我们心里就有底了,能获取到当前的表单值何愁校验不了。

import { Directive, forwardRef, Input } from '@angular/core';
import { Validator, AbstractControl, NG_VALIDATORS, ValidationErrors } from '@angular/forms';
@Directive({
  selector: `[checkboxDirective]`,
  providers: [
    {
      provide: NG_VALIDATORS,
      useExisting: forwardRef(() => CheckboxDirective),
      multi: true
    }
  ]
})
export class CheckboxDirective implements Validator {
  constructor() {
  }
  validate(c: AbstractControl): ValidationErrors|null {
    let isCheck = false ;
    if (c) {
        c.value.forEach(element => {
            if (element.checked ) {
                if (!isCheck) {
                    isCheck = true ;
                }
            }
        });
    }
    return isCheck ? null : {'validateCheck': isCheck};
  }
}

以上是我实现的对于checkbox 对象的校验实现。其中的selector:‘checkboxDirective’ 对应的就是下边html代码中的指令名称

<nz-checkbox-group checkboxDirective formControlName ="indicatorIds" [(ngModel)]="indicatorArr" ></nz-checkbox-group>

注意:同时也要将你写的校验器放入要使用的组件的模块(module)的declarations数组中

import { registerLocaleData } from '@angular/common';
import zh from '@angular/common/locales/zh';
import { NZ_I18N, zh_CN } from 'ng-zorro-antd';
import { CheckboxDirective } from '../../@core/directive/CheckboxDirective';

registerLocaleData(zh);

@NgModule({
  imports: [],
  declarations: [CheckboxDirective],
  providers: [
     { provide: NZ_I18N, useValue: zh_CN }],


})
export class ManageCenterModule { }

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[分享]如何使用Angular中的自定义校验器 的相关文章

随机推荐

  • Javacv+Nginx实现rtsp转rtmp实现web端直播方式

    前言 前面的文章中使用websocket的方案在web端实现rtsp播放 因为各种原因 现需要重新写一套方案 不废话 上才艺 补充 项目中需求可能要同时观看多个摄像头 将本项目放开限制使用多个摄像头时 就会发现相机之间的切换加载时间及视频流
  • Android:实现一种浮动选择菜单的效果

    前几天更新了一下我手机上的百阅软件 上面的浮动对话框选择很好看 就模仿了一下 先看一下运行效果 主要原理是在dialog里扔进一个GridView 可以作为一个组件使用 源码如下 对话框使用的layout grid dialog xml
  • Lumen 5.2 中配置邮件

    本文转自 https laravel china org topics 1974 Lumen中的邮件配置好了之后还是很简单的 但是配置过程官方文档省略了太多 先来扒一扒遇到的坑 Class mailer does not exist 这个是
  • Mysql内置函数全解析——Mysql初级(三)

    一 前言 在关系型数据库使用的过程中 我们总会对DB里面的数据做各种不同形式的转换 字符串处理等基本操作 本文将会比较系统的学习总结Mysql中的各种内置函数 这是一个系列的文章 感兴趣的小伙伴可以关注一下哦 本文的行文思路是这样的 因为M
  • 微信小程序——获取绑定事件元素的ID

    小程序list数据带值跳转 一般直接通过设置item的id来标识或者通过设置键值data xxxx的方式标识 如下图所示 解析出来的结果如下图 我们看到它在元素上绑定了一个checkSchoolLogin事件 触发这个事件时需要获取该元素的
  • 关于单链表结构体定义结点时 LNode *LinkList的理解

    typedef struct LNode ElemType data 数据域 struct LNode next 指针域 LNode LinkList 先说结论 这个就可以直接理解为 第一个是便于定义变量的类型为LNode 如果没有使用ty
  • springboot配置来连接多个mysql数据库

    1 在yml里配置多数据库 spring datasource app1 jdbc url jdbc mysql localhost 3306 data1 useUnicode true characterEncoding UTF 8 se
  • leetcode-143-重排链表

    题意描述 给定一个单链表 L 的头节点 head 单链表 L 表示为 L0 L1 Ln 1 Ln 请将其重新排列后变为 L0 Ln L1 Ln 1 L2 Ln 2 不能只是单纯的改变节点内部的值 而是需要实际的进行节点交换 解题思路 Ali
  • 【机器学习】为什么需要对数值型的特征做归一化(Normalization)?

    目录 为什么需要对数值型的特征做归一化 一 概念定义 二 标准化 归一化的原因 用途 2 1 原因 三 数据归一化的影响 四 常用的3种归一化方法 4 1 归一化公式 4 1 1 线性归一化 Min Max Scaling 即我们一般指的归
  • SpringBoot 整合Activiti(二)——流程审批完整示例

    前两天做了一个SpringBoot整合Activiti的完整示例 功能包括 退回 通过 节点条件 指定办理人 生成流程图 高亮显示已办节点 查询任务列表 办理人 等 下面先简单记录 含完整代码 十六上班后再详细补充 1 画流程图 高亮生成的
  • 《视觉slam十四讲》之第7讲-特征提取与匹配

    特征 特征为图像中具有代表性的区域 可以为角点 边缘和区块等 特征是图像信息的另一种数字表达形式 特征具有以下性质 可重复性 Repeatability 相同的 区域 可以在不同的图像中被找到 可区别性 Distinctiveness 不同
  • Linux运行shell脚本时报错"syntax error near unexpected token `$'\r''

    Linux运行shell脚本时 常常会发生syntax error near unexpected token r 或者syntax error unexpected end of file等 诸如此类的报错信息出现的原因是因为在编写脚本内
  • Shell编程中脱字符(^)的用法

    cat configs signatures tmp 将configs signatures tmp文件内容作为grep命令的输入 grep v v是grep排除的参数 将configs signatures tmp除去空行的内容作为sor
  • 蓝桥杯在哪下载准考证

    点击自己的头像 gt 我的大赛 gt 会出现如下 gt 点击Java软件开发 根据自己报的方向 gt 可以看到考试信息 gt 下载准考证即可 转载于 https blog 51cto com 13534640 2090954
  • Kafka消息阻塞

    转自 http jis117 iteye com blog 2279519 hi all 大家都很关心kafka消息阻塞的情况 感谢RoctetMQ给我们的教训 Kafka上线也有一段时间了 确实有出现过消息阻塞的情况 虽然不影响业务而且用
  • 判断逻辑关系的运算符 && 与,

    package com test basic chapter2 功能 判断逻辑关系的运算符 与 或 非 与 同为真即真 或 有真即真 非 public class LogicalOperators public static void ma
  • Java中map集合,你真的了解吗?

    在Java编程中 map集合是一个非常重要的数据结构 它可以存储键值对 并且可以根据键快速查找对应的值 今天 我们就来详细介绍一下Java中的map集合 首先 让我们来了解一下map集合的基本概念 在Java中 map集合是一个接口 它有多
  • padding的四个参数_Google Flutter 布局(二)-Padding、Align、Center详解

    1 1 简介 Padding在Flutter中用的也挺多的 作为一个基础的控件 功能非常单一 给子节点设置padding属性 写过其他端的都了解这个属性 就是设置内边距属性 内边距的空白区域 也是widget的一部分 Flutter中并没有
  • 深入理解Java——从入门到精通

    标题 深入理解Java 从入门到精通 Java是一门广泛应用于软件开发领域的高级编程语言 它的特点包括强大的跨平台性 面向对象的编程范式 丰富的类库以及良好的安全性 无论是在企业级应用开发 移动应用开发还是嵌入式系统开发中 Java都扮演着
  • [分享]如何使用Angular中的自定义校验器

    在Angular的开发中表单是必不可少的 由此引出的表单校验也是万万不可缺少的 解决方法一 全部使用ngModel 双向绑定数据 在最后的submit点击时进行所有表单的校验 这样做固然没有什么问题 而且代码写的也和我们之前使用jQuery