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 相关文章推荐
Node.js中使用Buffer编码、解码二进制数据详解
Aug 16 Javascript
JavaScript设计模式之抽象工厂模式介绍
Dec 28 Javascript
详解Bootstrap创建表单的三种格式(一)
Jan 04 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
Jul 08 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
Dec 14 Javascript
angularjs实现分页和搜索功能
Jan 03 Javascript
详解如何在Angular优雅编写HTTP请求
Dec 05 Javascript
浅谈JavaScript 代码简洁之道
Jan 09 Javascript
微信小程序新手教程之启动页的重要性
Mar 03 Javascript
JavaScript遍历数组和对象的元素简单操作示例
Jul 09 Javascript
vue+element-ui+axios实现图片上传
Aug 20 Javascript
js 闭包深入理解与实例分析
Mar 19 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 flv视频时间获取函数
2010/06/29 PHP
php中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
2014/11/22 PHP
php控制文件下载速度的方法
2015/03/24 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
php实现只保留mysql中最新1000条记录
2015/06/18 PHP
关于php 高并发解决的一点思路
2017/04/16 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
犀利的js 函数集合
2009/06/11 Javascript
Google的跟踪代码 动态加载js代码方法应用
2012/11/12 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
2016/12/30 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
解析vue中的$mount
2017/12/21 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
vue中el-upload上传图片到七牛的示例代码
2018/10/19 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
vue动态设置页面title的方法实例
2020/08/23 Javascript
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
使用Fabric自动化部署Django项目的实现
2019/09/27 Python
Pytorch to(device)用法
2020/01/08 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
浅谈django 重载str 方法
2020/05/19 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
捷克汽车配件和工具销售网站:TorriaCars
2018/02/26 全球购物
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
大学生毕业自我鉴定范文
2013/09/19 职场文书
浙江文明网签名寄语
2014/01/18 职场文书
2014年向国旗敬礼活动方案
2014/09/27 职场文书
暑期辅导班宣传单
2015/07/14 职场文书
干部培训简讯
2015/07/20 职场文书
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server