zoukankan      html  css  js  c++  java
  • angularjs组件之input mask

      最近项目中经常有一些对input输入进行格式化的需求,以前做的时候在js中写指令进行处理,但是这样又要在js或者在java代码中将请求的数据进行还原,很是麻烦,于是在网上看到了jquery的inputmask组件,觉得很好用,在项目中写出指令,用起来很方便。

      在项目中引入jquery和jquery-inputmask,然后在项目中写指令,如下:

     1 define(['./module'], function (directives) {
     2     'use strict';
     3     directives.directive('inputMask', function ($timeout) {
     4         return {
     5             restrict: 'EA',
     6             require: 'ngModel',
     7             link: function (scope, elm, attrs, ngModel) {
     8                 var applyModelEvents = [ "oncomplete", "onKeyUp", "onKeyValidation" ], maskType = "mask";
     9 
    10                 if (attrs.formatOption) {
    11                     var formatOption = scope.$eval(attrs.formatOption);
    12                     if (formatOption.parser) {
    13                         ngModel.$parsers.push(formatOption.parser);
    14                     }
    15 
    16                     if (formatOption.formatter) {
    17                         ngModel.$formatters.push(formatOption.formatter);
    18                     }
    19 
    20                     if (formatOption.isEmpty) {
    21                         ngModel.$isEmpty = formatOption.isEmpty;
    22                     }
    23                 }
    24 
    25                 var applyModel = function (fun) {
    26                     return function () {
    27                         (function (args) {
    28                             $timeout(function () {
    29                                 var viewValue = elm.inputmask('unmaskedvalue');
    30                                 if (viewValue !== ngModel.$viewValue) {
    31                                     ngModel.$setViewValue(viewValue);
    32                                 }
    33                                 if (fun) {
    34                                     fun.apply(scope, args);
    35                                 }
    36                             });
    37                         })(Array.prototype.slice.call(arguments));
    38                     };
    39                 };
    40 
    41                 var extendOption = function (option) {
    42                     var newOption = angular.extend({}, option);
    43                     angular.forEach(applyModelEvents, function (key) {
    44                         newOption[key] = applyModel(newOption[key]);
    45                     });
    46 
    47                     return newOption;
    48                 };
    49 
    50                 if (attrs.inputMask) {
    51                     maskType = scope.$eval(attrs.inputMask);
    52                 }
    53 
    54                 if (maskType) {
    55                     if (angular.isObject(maskType)) {
    56                         var maskOption = extendOption(maskType);
    57                         $timeout(function () {
    58                             elm.inputmask(maskOption);
    59                         });
    60                     } else {
    61                         var maskOption = extendOption(scope.$eval(attrs.maskOption) || {});
    62                         $timeout(function () {
    63                             elm.inputmask(maskType, maskOption);
    64                         });
    65                     }
    66                 }
    67 
    68                 elm.bind("blur", function(){
    69                     $timeout(function () {
    70                         if(attrs.isMask){
    71                             
    72                         }else{
    73                             ngModel.$setViewValue(elm.inputmask('unmaskedvalue'));
    74                         }
    75                     });
    76                 });
    77 
    78             }
    79         }
    80     });
    81 });

      如需要将银行卡号按银行卡格式显示:

      html:

    <input class="form-control" id="cardNo" name="cardNo" type="text" ng-model="cardNo" input-mask="cardOption"/>

      angular controller中cardOption:

    1 $scope.cardOption = {
    2                     mask: function () {
    3                         return ["9999 9999 9999 9999 [999]"];
    4                     }};

      如果日期表示的时候,将string直接转为data类型:

     1 $scope.dateFormatOption = {
     2                     parser: function (viewValue) {
     3                         return viewValue ? new Date(viewValue) : undefined;
     4                     },
     5                     formatter: function (modelValue) {
     6                         if (!modelValue) {
     7                             return "";
     8                         }
     9                         var date = new Date(modelValue);
    10                         return (date.getFullYear() + "-" + date.getMonth() + "-" + date.getDate()).replace(/(d)/g, "0$1");
    11                     },
    12                     isEmpty: function (modelValue) {
    13                         return !modelValue;
    14                     }
    15                 };

      html代码:

    1 <input type="text" ng-model="test1" input-mask="'y-m-d'" format-option="dateFormatOption"/>

      另外,指令中的一些属性需要注意:

     inputMask主要是制定页面展示的样式:如展示银行卡号的例子;
     format-option主要是指定在格式化的时候解析、格式化和为空的时候,数据的格式;如日期处理,最后进行请求的时候就是传入data类型;
     isMask主要是指定页面展示的是否是传入后台请求的数据,如卡号解析为XXXX XXXX XXXX XXXX,如果isMask为true则传入后台则为XXXX XXXX XXXX XXXX,否则为XXXXXXXXXXXXXXXX。
    maskOption:指定页面展示的样式,同时也可以用回调,在完成和验证的时候做一些处理动作。如下:
     1 $scope.testoption = {
     2                 "mask": "99-9999999",
     3                 "oncomplete": function () {
     4                     console.log();
     5                     console.log(arguments,"oncomplete!this log form controler");
     6                 },
     7                 "onKeyValidation": function () {
     8                     console.log("onKeyValidation event happend! this log form controler");
     9                 }
    10             }
    参数博客:http://www.cnblogs.com/whitewolf/p/3475687.html
  • 相关阅读:
    使用线程的场景
    进程和线程的区别
    线程基础
    Python程序中的进程操作-进程池(multiprocess.Pool)
    Python程序中的进程操作-进程间数据共享(multiprocess.Manager)
    Python程序中的进程操作-进程间通信(multiprocess.Queue)
    Python程序中的进程操作-进程同步(multiprocess.Lock)
    Python程序中的进程操作-开启多进程(multiprocess.process)
    关于<a>标签的onclick与href的执行顺序
    SQLServer2008不允许保存更改
  • 原文地址:https://www.cnblogs.com/lcngu/p/6666924.html
Copyright © 2011-2022 走看看