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的页面划词搜索JS
Sep 14 Javascript
javascript实现div的显示和隐藏的小例子
Jun 25 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
Jan 28 Javascript
几句话带你理解JS中的this、闭包、原型链
Sep 26 Javascript
JS 拦截全局ajax请求实例解析
Nov 29 Javascript
bootstrap+jQuery实现的动态进度条功能示例
May 25 jQuery
详解Vue中localstorage和sessionstorage的使用
Dec 22 Javascript
微信小程序数据存储与取值详解
Jan 30 Javascript
浅谈vue首屏加载优化
Jun 28 Javascript
JavaScript中filter的用法实例分析
Feb 27 Javascript
详解vue beforeEach 死循环问题解决方法
Feb 25 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
Aug 03 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里的JS打印函数
2006/10/09 PHP
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
php中实现简单的ACL 完结篇
2011/09/07 PHP
PHP中如何防止外部恶意提交调用ajax接口
2016/04/11 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
彻底搞懂PHP 变量结构体
2017/10/11 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
jquery $.ajax入门应用二
2008/11/19 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
javascript数组去重3种方法的性能测试与比较
2013/03/26 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
JQuery中serialize() 序列化
2015/03/13 Javascript
javascript实现添加附件功能的方法
2015/11/18 Javascript
js+css实现回到顶部按钮(back to top)
2016/03/02 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
vue采用EventBus实现跨组件通信及注意事项小结
2018/06/14 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
python根据给定文件返回文件名和扩展名的方法
2015/03/27 Python
Python使用getpass库读取密码的示例
2017/10/10 Python
详解Python3定时器任务代码
2019/09/23 Python
基于torch.where和布尔索引的速度比较
2020/01/02 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
PHP中如何使用Cookie
2015/10/28 面试题
行政部岗位职责范本
2014/03/13 职场文书
表彰大会策划方案
2014/05/13 职场文书
分公司负责人任命书
2014/06/04 职场文书
应届大专生自荐书
2014/06/16 职场文书
应届生自荐书
2014/06/23 职场文书
年检委托书
2014/08/30 职场文书
人事主管岗位职责
2015/02/04 职场文书
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL