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 相关文章推荐
HTML TO JavaScript 转换
Jun 26 Javascript
用JS将搜索的关键字高亮显示实现代码
Nov 08 Javascript
如何通过javascript操作web控件的自定义属性
Nov 25 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
Feb 12 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
May 07 Javascript
extjs 分页使用jsp传递数据示例
Jul 29 Javascript
jquery对复选框(checkbox)的操作汇总
Jan 13 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
Dec 07 Javascript
js手机号批量滚动抽奖实现代码
Apr 17 Javascript
微信小程序实现列表页的点赞和取消点赞功能
Nov 02 Javascript
vue element-ui实现input输入框金额数字添加千分位
Dec 29 Javascript
JS+CSS实现炫酷光感效果
Sep 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代码飞起来的40条小技巧(提升php效率)
2010/04/12 PHP
PHP is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
PHP采集利器 Snoopy 试用心得
2011/07/03 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
js 链式延迟执行DOME
2012/01/04 Javascript
js中opener与parent的区别详细解析
2014/01/14 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
Jquery遍历select option和添加移除option的实现方法
2016/08/26 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
2016/10/10 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
JS中利用FileReader实现上传图片前本地预览功能
2018/03/02 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
react MPA 多页配置详解
2019/10/18 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
在Django框架中编写Context处理器的方法
2015/07/20 Python
利用Python爬取可用的代理IP
2016/08/18 Python
python enumerate函数的使用方法总结
2017/11/15 Python
Python进阶之自定义对象实现切片功能
2019/01/07 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
FFT快速傅里叶变换的python实现过程解析
2019/10/21 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
2020/03/19 Python
python实现取余操作的简单实例
2020/08/16 Python
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
shell的种类有哪些
2015/04/15 面试题
公司演讲稿开场白
2014/08/25 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
幼儿园个人总结
2015/02/28 职场文书
遗嘱范文
2015/08/07 职场文书
如何利用opencv判断两张图片是否相同详解
2021/07/07 Python