angular 表单验证器验证的同时限制输入的实现


Posted in Javascript onApril 11, 2019

angular里面对于表单验证,设置了很多指令。

也就是说不用自己写一些逻辑,直接绑定指令就行。

ng-app     启动你angular的模块

 ng-controller 控制器,启动你angualr里面的逻辑代码作用在页面上

ng-options  循环你select里面的option标签,很好用的

 ng-submit,表单提交执行的

novalidate  表单form配合后期检测的

ng-model  实现双数据绑定

ng-show 根据一定的逻辑实现显示

ng-cloak 绑定在节点上,防止节点渲染,angular指令闪烁

ng-class class类名根据你的逻辑,出现

ng-required 检测你的input为不为空

ng-pattern 正则表达式,绑定在input上面限制输入规范

ng-maxlength 最多输入限制

ng-minlength 最少输入限制

ng-disabled="myForm.$invalid" 脏检测

大概就需要这些指令了,大家不要喷我。谢谢

仔细回想以前使用响应式表单的验证器的时候,只是验证输入的值是否非法,而没有做对应的限制输入,比如当输入一串金额的时候只能输入数字,有这种需求的时候,我们该怎么做限制输入?用input来监听?用onModelChange来监听?我们可以直接写在验证器里面。

表单的验证分为模板驱动验证和响应式表单的验证,响应式表单添加自定义验证器非常方便,所以我们来直接以响应式表单的验证为研究基础。

首先构造基本的表单:

<form nz-form [formGroup]="validateForm">
 <nz-form-item>
  <nz-form-label [nzSpan]="6" nzFor="code">GA Code</nz-form-label>
  <nz-form-control [nzSpan]="14">
   <input nz-input name="code" formControlName="code" id="code">
  </nz-form-control>
 </nz-form-item >
</form>
validateForm: FormGroup;
constructor(
  private fb: FormBuilder,
) {
}
ngOnInit() {
  this.validateForm = this.fb.group({
    code: [33, [Validators.required, Validators.maxLength(6)]],
  });
}

我们创建的这个响应式表单是要验证一个谷歌验证的「code」字段,并给与了两个验证器,一个必填验证,一个验证长度最长是6位。运行起来后,我们输入的如果超过6位范围输入框就会变成红色,这是OK的。

现在我们需要在验证的同时限制输入,比如只让用户输入数字,其他的一切都不可输入。

创建验证器,在验证的同时,限制输入

我们使用正则表达式来判断。首先,判断一个字符串是否是全数字:/^\d*$/.test(value)。然后将有「杂质」的字符串修正为纯数字:value.replace(/[^0-9]/ig, '')。

思路是,创建验证器,当有输入值的时候,验证器运行,判断是否是全数字,如果不是就进行替换。我们可以得到如下的验证器:

onlyNumber(): ValidatorFn {
  return (control: AbstractControl): {[key: string]: any} | null => {
    // value有值且如果值包含非数字,就需要替换
    if (control.value && !/^\d*$/.test(control.value)) {
      control.setValue(control.value.replace(/[^0-9]/ig, ''), {
        emitEvent: false,
        emitViewToModelChange: false,
      });
    }
    return null;
  };
}

将验证器使用在我们的响应式表单上:

this.validateForm = this.fb.group({
  code: [33, [Validators.required, this.onlyNumber(), Validators.maxLength(6)]],
});

运行程序,随便输入来测试测试,竟然是ok的??(那我前几次的时候是做了什么骚造作让浏览器堆栈溢出的???)

emmmmmmmm。。。。。。我上次确实是让浏览器堆栈溢出了,这次正常反而很奇怪了。不影响,我们来看看setValue(value, options)的options几个配置参数吧:

  • onlySelf:如果为 true,则每次变更只影响该控件本身,不影响其父控件。默认为 false。
  • emitEvent:如果为 true 或未提供(默认),则当控件值变化时, statusChanges 和 valueChanges 这两个 Observable 都会以最近的状态和值发出事件。 如果为 false,则不会发出事件。
  • emitModelToViewChange:如果为 true 或未提供(默认),则每次变化都会触发一个 onChange 事件以更新视图。
  • emitViewToModelChange:如果为 true 或未提供(默认),则每次变化都会触发一个 ngModelChange 事件以更新模型。

首先,对于onlySelf来讲,如果我们有跨字段的验证的话,设置这个为false就不影响表单层次的验证器。emitEvent是对statusChange和valeChanges两个Observable的影响,一般我们用Observable的方式监听字段的值变化时有用到。emitModelToViewChange配置是触发onChange来更新视图的,如果如果设置为false的话,无论我们怎么更新字段的值,是不会显示在页面上的。emitViewToModelChange触发ngModelCahnge时间更新模型,但好像这个参数设置为false并没什么用。

得得得,好的就行。

假如我们需要在验证的条件也和其他表单字段有关系怎么办?那我们需要formGroup级的验证。

formGroup的验证器

我们需要这样创建验证器,返回一个由formGroup构成的验证器:

onlyNumberValidator(formKeys: string[]): ValidatorFn {
  return (formGroup: FormGroup): ValidationErrors | null => {
    for (const key of formKeys) {
      const value = formGroup.controls[key].value;
      if (value && !/^\d*$/.test(value)) {
        formGroup.controls[key].setValue(value.replace(/[^0-9]/ig, ''), {
          onlySelf: true,
        });
      }
    }
    return null;
  }};

使用:

this.validateForm = this.fb.group({
  typeList: [[]],
  feeRate: [null, [Validators.required, Validators.pattern(/^[0-9]+(.[0-9]{1,2})?$/), Validators.max(0.999)]],
  code: [33, [Validators.required, Validators.maxLength(6)]],
}, {
  validator: this.onlyNumberValidator(['code']),
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
12款经典的白富美型—jquery图片轮播插件—前端开发必备
Jan 08 Javascript
jquery实现metro效果示例代码
Sep 06 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
Nov 08 Javascript
JavaScript实现控制打开文件另存为对话框的方法
Apr 17 Javascript
js脚本分页代码分享(7种样式)
Aug 19 Javascript
jQuery+css实现的换页标签栏效果
Jan 27 Javascript
jQuery的ajax和遍历数组json实例代码
Aug 01 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
Jan 09 Javascript
jQuery实现鼠标响应式淘宝动画效果示例
Feb 13 jQuery
jQuery+Datatables实现表格批量删除功能【推荐】
Oct 24 jQuery
JS散列表碰撞处理、开链法、HashTable散列示例
Feb 08 Javascript
vue+Element实现搜索关键字高亮功能
May 28 Javascript
angular 实现同步验证器跨字段验证的方法
Apr 11 #Javascript
vue实现新闻展示页的步骤详解
Apr 11 #Javascript
记一次用vue做的活动页的方法步骤
Apr 11 #Javascript
vue数据初始化initState的实例详解
Apr 11 #Javascript
Vue起步(无cli)的啊教程详解
Apr 11 #Javascript
vue+vuex+json-seiver实现数据展示+分页功能
Apr 11 #Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
Apr 10 #Javascript
You might like
php的header和asp中的redirect比较
2006/10/09 PHP
在 Laravel 项目中使用 webpack-encore的方法
2019/07/21 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
node.js中的path.extname方法使用说明
2014/12/09 Javascript
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
简介JavaScript中的italics()方法的使用
2015/06/08 Javascript
详细解读JavaScript的跨浏览器事件处理
2015/08/12 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
2017/06/09 jQuery
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
pycharm修改界面主题颜色的方法
2019/01/17 Python
python中import与from方法总结(推荐)
2019/03/21 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
pycharm 中mark directory as exclude的用法详解
2020/02/14 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
python中pyqtgraph知识点总结
2021/01/26 Python
canvas烟花特效锦集
2018/01/17 HTML / CSS
日本最大的眼镜购物网站:Oh My Glasses
2016/11/13 全球购物
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
中学教师实习自我鉴定
2013/09/28 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
2014年骨干教师工作总结
2014/12/19 职场文书
2016新年致辞
2015/08/01 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
学校就业保障协议书
2019/06/24 职场文书
Python采集壁纸并实现炫轮播
2022/04/30 Python