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 相关文章推荐
XHTML-Strict 内允许出现的标签
Dec 11 Javascript
Jquery插件之打造自定义的select标签
Nov 30 Javascript
jQuery根据纬度经度查看地图处理程序
May 08 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
Jun 17 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
Aug 21 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
Jun 29 Javascript
使用jQuery调用XML实现无刷新即时聊天
Aug 07 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
Sep 03 Javascript
自己封装的一个简单的倒计时功能实例
Nov 23 Javascript
vue用递归组件写树形控件的实例代码
Jul 19 Javascript
Vue运用transition实现过渡动画
May 06 Javascript
vue实现文件上传读取及下载功能
Nov 17 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从数组中随机抽取一些元素的代码
2012/11/05 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
JQuery下的Live方法和$.browser方法使用代码
2010/06/02 Javascript
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
JavaScript禁止页面操作的示例代码
2013/12/17 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
js仿微博实现统计字符和本地存储功能
2015/12/22 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
js轮播图的插件化封装详解
2017/07/17 Javascript
在vue项目中,使用axios跨域处理
2018/03/07 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
详解ES6 Promise对象then方法链式调用
2018/10/20 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python的一些用法分享
2012/10/07 Python
Python中的CURL PycURL使用例子
2014/06/01 Python
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
2018/02/07 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
python字典嵌套字典的情况下找到某个key的value详解
2019/07/10 Python
Python的log日志功能及设置方法
2019/07/11 Python
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
德国排名第一的主题公园门票网站:Attraction Tickets Direct
2019/09/09 全球购物
英语硕士生求职简历的自我评价
2013/10/15 职场文书
外贸主管求职简历的自我评价
2013/10/23 职场文书
学生会竞选演讲稿学习部
2014/08/25 职场文书
见习报告的格式
2014/11/04 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
2014大学生学生会工作总结
2014/12/19 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
来探秘“德国中小企业”的成功之道
2019/07/26 职场文书
python 自动化偷懒的四个实用操作
2021/04/11 Python