Angular.js组件之input mask对input输入进行格式化详解


Posted in Javascript onJuly 10, 2017

前言

最近因为项目的需要,经常有一些对input输入进行格式化的需求,以前做的时候在js中写指令进行处理,但是这样又要在js或者在java代码中将请求的数据进行还原,很是麻烦,于是在网上看到了jquery的inputmask组件,觉得很好用,在项目中写出指令,用起来很方便。

方法如下:

在项目中引入jquery和jquery-inputmask,然后在项目中写指令,如下:

define(['./module'], function (directives) {
 'use strict';
 directives.directive('inputMask', function ($timeout) {
 return {
  restrict: 'EA',
  require: 'ngModel',
  link: function (scope, elm, attrs, ngModel) {
  var applyModelEvents = [ "oncomplete", "onKeyUp", "onKeyValidation" ], maskType = "mask";

  if (attrs.formatOption) {
   var formatOption = scope.$eval(attrs.formatOption);
   if (formatOption.parser) {
   ngModel.$parsers.push(formatOption.parser);
   }

   if (formatOption.formatter) {
   ngModel.$formatters.push(formatOption.formatter);
   }

   if (formatOption.isEmpty) {
   ngModel.$isEmpty = formatOption.isEmpty;
   }
  }

  var applyModel = function (fun) {
   return function () {
   (function (args) {
    $timeout(function () {
    var viewValue = elm.inputmask('unmaskedvalue');
    if (viewValue !== ngModel.$viewValue) {
     ngModel.$setViewValue(viewValue);
    }
    if (fun) {
     fun.apply(scope, args);
    }
    });
   })(Array.prototype.slice.call(arguments));
   };
  };

  var extendOption = function (option) {
   var newOption = angular.extend({}, option);
   angular.forEach(applyModelEvents, function (key) {
   newOption[key] = applyModel(newOption[key]);
   });

   return newOption;
  };

  if (attrs.inputMask) {
   maskType = scope.$eval(attrs.inputMask);
  }

  if (maskType) {
   if (angular.isObject(maskType)) {
   var maskOption = extendOption(maskType);
   $timeout(function () {
    elm.inputmask(maskOption);
   });
   } else {
   var maskOption = extendOption(scope.$eval(attrs.maskOption) || {});
   $timeout(function () {
    elm.inputmask(maskType, maskOption);
   });
   }
  }

  elm.bind("blur", function(){
   $timeout(function () {
   if(attrs.isMask){
    
   }else{
    ngModel.$setViewValue(elm.inputmask('unmaskedvalue'));
   }
   });
  });

  }
 }
 });
});

如需要将银行卡号按银行卡格式显示:

html:

<input class="form-control" id="cardNo" name="cardNo" type="text" ng-model="cardNo" input-mask="cardOption"/>

angular controller中cardOption:

$scope.cardOption = {
   mask: function () {
    return ["9999 9999 9999 9999 [999]"];
   }};

如果日期表示的时候,将string直接转为data类型:

$scope.dateFormatOption = {
   parser: function (viewValue) {
   return viewValue ? new Date(viewValue) : undefined;
   },
   formatter: function (modelValue) {
   if (!modelValue) {
    return "";
   }
   var date = new Date(modelValue);
   return (date.getFullYear() + "-" + date.getMonth() + "-" + date.getDate()).replace(/\b(\d)\b/g, "0$1");
   },
   isEmpty: function (modelValue) {
   return !modelValue;
   }
  };

html代码:

<input type="text" ng-model="test1" input-mask="'y-m-d'" format-option="dateFormatOption"/>

另外,指令中的一些属性需要注意:

inputMask主要是制定页面展示的样式:如展示银行卡号的例子;

 1、format-option主要是指定在格式化的时候解析、格式化和为空的时候,数据的格式;如日期处理,最后进行请求的时候就是传入data类型;

 2、isMask主要是指定页面展示的是否是传入后台请求的数据,如卡号解析为XXXX XXXX XXXX XXXX,如果isMask为true则传入后台则为XXXX XXXX XXXX XXXX,否则为XXXXXXXXXXXXXXXX。

  3、maskOption:指定页面展示的样式,同时也可以用回调,在完成和验证的时候做一些处理动作。如下:

$scope.testoption = {
  "mask": "99-9999999",
  "oncomplete": function () {
   console.log();
   console.log(arguments,"oncomplete!this log form controler");
  },
  "onKeyValidation": function () {
   console.log("onKeyValidation event happend! this log form controler");
  }
  }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
使用jQuery轻松实现Ajax的实例代码
Aug 16 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
May 28 Javascript
js实现同一页面多个不同运动效果的方法
Apr 10 Javascript
简介AngularJS的HTML DOM支持情况
Jun 17 Javascript
深入理解(function(){... })();
Aug 16 Javascript
基于JavaScript Array数组方法(新手必看篇)
Aug 20 Javascript
canvas实现简易的圆环进度条效果
Feb 28 Javascript
javascript实现文件拖拽事件
Mar 29 Javascript
最简单的JS实现json转csv的方法
Jan 10 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
Sep 11 Javascript
JS数组进阶示例【数组的几种函数用法】
Jan 16 Javascript
ant design 日期格式化的实现
Oct 27 Javascript
underscore之Chaining_动力节点Java学院整理
Jul 10 #Javascript
Vue 2.0的数据依赖实现原理代码简析
Jul 10 #Javascript
Vue实现virtual-dom的原理简析
Jul 10 #Javascript
Vue2路由动画效果的实现代码
Jul 10 #Javascript
深入浅析Node.js单线程模型
Jul 10 #Javascript
require.js中的define函数详解
Jul 10 #Javascript
vue.js组件之间传递数据的方法
Jul 10 #Javascript
You might like
利用php递归实现无限分类 格式化数组的详解
2013/06/08 PHP
php通过字符串调用函数示例
2014/03/02 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
JavaScript匿名函数用法分析
2015/02/13 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
2016/05/23 Javascript
jquery实现界面无刷新加载登陆注册
2016/07/30 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
AngularJS实现自定义指令与控制器数据交互的方法示例
2017/06/19 Javascript
JS图片预加载插件详解
2017/06/21 Javascript
基于ES6 Array.of的用法(实例讲解)
2017/09/05 Javascript
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
跟老齐学Python之从格式化表达式到方法
2014/09/28 Python
python中argparse模块用法实例详解
2015/06/03 Python
Python变量和字符串详解
2017/04/29 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
python实现任意位置文件分割的实例
2018/12/14 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
python使用PyQt5的简单方法
2019/02/27 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
django框架基于模板 生成 excel(xls) 文件操作示例
2019/06/19 Python
Python实现画图软件功能方法详解
2020/07/28 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
美术专业个人自我评价
2014/01/18 职场文书
党员自评材料范文
2014/12/17 职场文书
Python破解极验滑动验证码详细步骤
2021/05/21 Python
python 经纬度求两点距离、三点面积操作
2021/06/03 Python
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB