Angular2 - FormControl 模糊验证

2023-12-09

我正在考虑添加一些基本的电子邮件验证来检查用户是否输入了正确的电子邮件地址。目前使用下面的方法,验证随着用户输入而更新,当输入一个字符后出错时,这看起来很奇怪。

validEmail(c: Control){
if(!c.value.match('[a-z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?')){
  return {
    validEmail: true
  };
}
return null;
}    

ctrlEmailAddress: Control = new Control('', Validators.compose([
Validators.required, this.validEmail]));

我想知道是否可以触发对字段模糊的验证,就像在 angularJS 中一样:

ng-model-options="{ updateOn: 'blur' }"

我知道 html 中输入字段上的模糊选项,但这不会使我的控件出错,除非有办法将控件置于错误状态。

有人能帮我指出正确的方向吗?

Thanks.

编辑:我正在寻找 Angular2 解决方案,而不是 AngularJS 解决方案。


EDIT 2

As Alex官方文档 says, 角度版本 5.0.0为您的 ngModel 提供了新选项updateOn: 'blur'

this.email = new FormControl(null, {
   validators: Validators.required,
   updateOn: 'blur'
});

您还可以使用其他更新选项:change(默认),blur, submit.


Original

我使用指令删除焦点上的整个验证并在模糊事件后将其返回。它基于克里斯蒂安·德尚的回答。

我仅在模糊时更新有效性,因此如果值在焦点之前无效,则焦点之后也将无效。但如果您开始输入,有效性将会更新。

由于某些原因,清除顺序是有意义的,因此我首先清除异步验证器。

任何提供的建议都会有帮助=)

import { Directive } from '@angular/core';
import { NgControl } from '@angular/forms';

@Directive({
  selector: '[validate-onblur]',
  host: {
    '(focus)': 'onFocus($event)',
    '(blur)': 'onBlur($event)'
  }
})
export class ValidateOnBlurDirective {
    private validators: any;
    private asyncValidators: any;
    constructor(public formControl: NgControl) {
    }
    onFocus($event) {
      this.validators = this.formControl.control.validator;
      this.asyncValidators = this.formControl.control.asyncValidator;
      this.formControl.control.clearAsyncValidators();
      this.formControl.control.clearValidators();
    }

    onBlur($event) {
      this.formControl.control.setAsyncValidators(this.asyncValidators);
      this.formControl.control.setValidators(this.validators);
      this.formControl.control.updateValueAndValidity();
    }
}

另外还请大家持续关注本期内容Angular 2 github 线程关于 onBlur 验证


EDIT 1

还有另一个问题 - 如果我只是单击该字段,然后单击离开 - 将调用验证。如果您有任何有关它的通知(或服务器调用) - 它会在您每次执行操作时出现。所以你可以添加wasChanged属性并像这样使用它:

    @Directive({
        selector: '[validate-onblur]',
        host: {
            '(focus)': 'onFocus($event)',
            '(blur)': 'onBlur($event)',
            '(keyup)': 'onKeyup($event)',
            '(change)': 'onChange($event)',
            '(ngModelChange)': 'onNgModelChange($event)'
        }
    })
    export class ValidationOnBlurDirective {
        private validators: any;
        private asyncValidators: any;
        private wasChanged: any;
        constructor(public formControl: NgControl) {
        }
        onFocus($event) {
            this.wasChanged = false;
            this.validators = this.formControl.control.validator;
            this.asyncValidators = this.formControl.control.asyncValidator;
            this.formControl.control.clearAsyncValidators();
            this.formControl.control.clearValidators();
        }
        onKeyup($event) {
            this.wasChanged = true; // keyboard change
        }
        onChange($event) {
            this.wasChanged = true; // copypaste change
        }
        onNgModelChange($event) {
            this.wasChanged = true; // ng-value change
        }
        onBlur($event) {
            this.formControl.control.setAsyncValidators(this.asyncValidators);
            this.formControl.control.setValidators(this.validators);
            if (this.wasChanged)
                this.formControl.control.updateValueAndValidity();
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular2 - FormControl 模糊验证 的相关文章

随机推荐

  • 我的 JavaScript 代码只打印一行。我需要它打印 10 行,每行 20 个字符。

    这是一个抛硬币随机发生器 我需要打印 10 行 20 列 这就是我被困住的地方 每次我单击按钮时 我的代码似乎都会正确随机化 它显示 20 列 但我似乎无法让它打印第二行 这可能是一些简单的事情 我只是没有抓住 任何事情都会受到赞赏 Jav
  • 确定 viewWillAppear 是来自打开应用程序,还是取消选择模式

    我目前正在初始屏幕上加载应用程序加载数据 在我看来这会发生 我还有一个在此屏幕上弹出的模式 关闭时执行与 viewWillAppear 中加载数据相同的逻辑 如何仅在应用程序打开时加载数据 而不是在模式关闭时加载数据 UIViewContr
  • std::vector 中的数据存储是连续的吗? [复制]

    这个问题在这里已经有答案了 我有一个字符向量 我想将其内容作为 char 传递给另一个函数 void foo boost shared ptr
  • 难以理解/可视化 SICP 流汉明数程序

    我基本上陷入了 SICP 练习 3 56 的困境 问题是这样的 练习3 56 R Hamming 首先提出的一个著名问题是 按升序且不重复地枚举除 2 3 或 5 之外没有质因数的所有正整数 一种明显的方法是简单地测试每个整数反过来看看它是
  • 制作一个循环来形成一个列表?

    def make services routes data routes curr route x split routes routes data service data1 x 1 106 106 1 1 43009 106 2 51
  • C# 将列表与自定义对象进行比较但忽略顺序

    我正在尝试比较两个包含自定义对象的列表 包装在一个对象中 我不关心顺序 但如果列表 1 包含 1 2 3 4 那么列表 2 必须and only包含这些元素 例如 4 2 3 1 基于比较两个 List 对象是否相等 忽略顺序ignorin
  • 如何在 PHP 中实时实现 For 循环

    我想制作一个实时给出结果的脚本 在我的脚本中它有 3 个步骤 第一步是从网页中获取所有链接 我使用 pregmatch all 函数 因为我需要的所有链接都以相同的域开始http example com docs 并从中抓取http tes
  • Windows 中的 64 位和 32 位注册表问题(C# 编程)

    我正在尝试将数据从 Windows 注册表获取到我的软件 但有一件事我遇到了麻烦 如果我的软件在 64 位系统上运行 则注册表路径将为 HKEY LOCAL MACHINE SOFTWARE Wow6432Node AVAST Softwa
  • 将 BigQuery 脚本的结果返回到 Python 客户端

    截至 2019 年秋季 BigQuery 支持脚本编写 这太棒了 我不明白的是BigQuery 的 Python 客户端尚有能力利用这一新功能 例如 运行以下 Python 代码 client bigquery Client QUERY B
  • EF Core,按 UTC 日期的月份和年份分组

    我将所有日期存储为 UTC 并且我需要按月份和年份对实体进行分组 所以我正在这样做 dbContext Tickets Where x gt x Date gt from x Date lt to GroupBy x gt new Year
  • TableView 单元格中 TextView 的可变高度

    我有一个基本的UITableView 我在线填写了一个网络服务 但我找不到一种方法来根据我的高度设置单元格的高度 动态单元格数量 textView 这是我填写单元格的方式 UITextView textView UITextView cel
  • PHP/jQuery - 如何将多维 PHP 数组转换为 JSON 字符串?

    正如标题所述 我正在尝试使用 Bootstrap 的 Typeahead js 它需要像这样的 JSON 字符串 var subjects PHP MySQL SQL PostgreSQL HTML CSS HTML5 CSS3 JSON
  • 如何让图表内容区域占据其可用的最大区域?

    非常简单的问题 如何让图表内容区域占据其可用的最大区域 我正在使用 JavaFX 就我而言 我想要有许多基于 true false 的 AreaChartsyAxis 0 1 不幸的是 我找不到如何使用类似方法更改这些图表的内容高度的解决方
  • 如何使用 Maven 将 JavaFX 项目部署到 EXE?

    我希望这个问题看起来并不基础 但尽管研究了几个小时 我还是找不到任何好的文档 我将 Maven 版本 3 3 9 用于我的 JavaFX 版本 11 0 2 和 JDK 13 0 1 项目 并想要构建一个 EXE 做到这一点最简单的方法是什
  • 如何使用java代码获取USB驱动器序列号或元数据

    我用java准备了一个桌面应用程序 我想通过 Pendrive 或任何其他 USB 驱动器来保护它 但我不知道如何使用java代码读取pendrive或usb驱动器 这样我就可以限制应用程序 请帮助我该怎么做 或者对此有其他想法吗 谢谢 就
  • 我可以像“delete[]”那样获取动态分配数组的大小吗?

    我想知道如何delete 知道动态分配数组的大小 并且我发现this问题 还有this微软论坛上的问题 但答案是相似的 事实证明answer is 它通常存储在您分配的内存之前的 头 段中 因此 确切的细节是特定于实现的 在该答案下 其中一
  • 如何使textview文本链接可点击

    Android Studio 2 3 1 我正在尝试创建一些不是 Web 或 html 的文本 而只是一些普通文本 我希望这些文本看起来像一个 Web 链接 单击时可以单击 正文是这样的 Contains 3 reviews 我想让它看起来
  • 将 null 绑定到准备好的语句时发生 Postgres bytea 错误

    我正在使用一个使用 JPA 和 Postgres 数据库的 Java 应用程序 并且我正在尝试创建一个灵活的准备好的语句 它可以处理可变数量的输入参数 一个示例查询可以最好地解释这一点 SELECT FROM my table WHERE
  • 如何给元素添加点击事件?

    我想用纯 JavaScript 不使用 jQuery 向这样的元素添加一个点击事件 所以我没有id但是一个类 a href http example com share class MyClass Yummy a 如果您没有 id 也没有任
  • Angular2 - FormControl 模糊验证

    我正在考虑添加一些基本的电子邮件验证来检查用户是否输入了正确的电子邮件地址 目前使用下面的方法 验证随着用户输入而更新 当输入一个字符后出错时 这看起来很奇怪 validEmail c Control if c value match a