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 日期计算算法
Sep 11 Javascript
javascript数组操作总结和属性、方法介绍
Apr 05 Javascript
JavaScript中的定时器之Item23的合理使用
Oct 30 Javascript
JS数组去掉重复数据只保留一条的实现代码
Aug 11 Javascript
基于JavaScript Array数组方法(新手必看篇)
Aug 20 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
Sep 16 Javascript
JavaScript数据结构之数组的表示方法示例
Apr 12 Javascript
React props和state属性的具体使用方法
Apr 12 Javascript
Vue中保存数据到磁盘文件的方法
Sep 06 Javascript
Vue递归实现树形菜单方法实例
Nov 06 Javascript
Vue数据双向绑定底层实现原理
Nov 22 Javascript
前端canvas中物体边框和控制点的实现示例
Aug 05 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处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
JavaScript小技巧 2.5 则
2010/09/12 Javascript
JS跨域总结
2012/08/30 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
javascript读取xml实现javascript分页
2013/12/13 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
jQuery实现的输入框选择时间插件用法实例
2015/02/28 Javascript
JavaScript中iframe实现局部刷新的几种方法汇总
2016/01/06 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
JavaScript 反射和属性赋值实例解析
2019/10/28 Javascript
python实现的jpg格式图片修复代码
2015/04/21 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
Python中read()、readline()和readlines()三者间的区别和用法
2017/07/30 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
python使用Qt界面以及逻辑实现方法
2019/07/10 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
Pycharm添加虚拟解释器报错问题解决方案
2020/10/13 Python
CSS实现雨滴动画效果的实例代码
2019/10/08 HTML / CSS
介绍一下代理模式(Proxy)
2014/10/17 面试题
linux面试题参考答案(4)
2013/01/28 面试题
药学专业毕业生求职信
2013/10/20 职场文书
毕业评语大全
2014/05/04 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
2014年文员工作总结
2014/11/18 职场文书
同学会邀请函模板
2015/01/30 职场文书
2015年妇产科工作总结
2015/05/18 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS
Python Django 后台管理之后台模型属性详解
2021/04/25 Python
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL