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 相关文章推荐
用户注册常用javascript代码
Aug 29 Javascript
基于jQuery实现自动轮播旋转木马特效
Nov 02 Javascript
详解Javacript和AngularJS中的Promises
Feb 09 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
May 19 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
Apr 06 Javascript
setTimeout与setInterval的区别浅析
Mar 23 Javascript
详解vue中使用protobuf踩坑记
May 07 Javascript
原生js实现抽奖小游戏
Jun 27 Javascript
解决vuex刷新状态初始化的方法实现
Aug 15 Javascript
vue制作抓娃娃机的示例代码
Apr 17 Javascript
Vue基于iview table展示图片实现点击放大
Aug 05 Javascript
vue实现移动端返回顶部
Oct 12 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
我的论坛源代码(十)
2006/10/09 PHP
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
2013/05/07 Javascript
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
2014/10/31 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
js改变css样式的三种方法推荐
2016/06/28 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
2018/09/14 Javascript
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
JavaScript中的连续赋值问题实例分析
2019/07/12 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
[05:42]DOTA2英雄梦之声_第10期_蝙蝠骑士
2014/06/21 DOTA
Python 深入理解yield
2008/09/06 Python
对python Tkinter Text的用法详解
2018/10/11 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
python实现图片压缩代码实例
2019/08/12 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
2019/09/20 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
解决IDEA 的 plugins 搜不到任何的插件问题
2020/05/04 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
Python爬虫实现自动登录、签到功能的代码
2020/08/20 Python
用python发送微信消息
2020/12/21 Python
美国领先的家居装饰和礼品商店:Kirkland’s
2017/01/30 全球购物
澳大利亚在线购买儿童玩具:Toy Universe
2017/12/28 全球购物
包装类的功能、种类、常用方法
2012/01/27 面试题
建筑毕业生自我鉴定
2013/10/18 职场文书
国际贸易专业个人鉴定
2014/02/22 职场文书
小学生表扬稿范文
2015/05/05 职场文书