AngularJS实现Input格式化的方法


Posted in Javascript onNovember 07, 2016

本文实例讲述了AngularJS实现Input格式化的方法。分享给大家供大家参考,具体如下:

今天在Angular中文群有位同学问到:如何实现对input box的格式化。如下的方式对吗?

<input type="text" ng-model="demo.text | uppercase" />

这当然是不对的。在Angular中filter(过滤器)是为了显示数据的格式,它将$scope上的Model数据格式化View显示的数据绑定到DOM之上。它并不会负责ngModel的绑定值的格式化。

在Angular中ngModel作为Angular双向绑定中的重要组成部分,负责View控件交互数据到$scope上Model的同步。当然这里存在一些差异,View上的显示和输入都是字符串类型,而在Model上的数据则是有特定数据类型的,例如常用的Number、Date、Array、Object等。ngModel为了实现数据到Model的类型转换,在ngModelController中提供了两个管道数组$formatters和$parsers,它们分别是将Model的数据转换为View交互控件显示的值和将交互控件得到的View值转换为Model数据。它们都是一个数组对象,在ngModel启动数据转换时,会以UNIX管道式传递执行这一系列的转换。Angular允许我们手动的添加$formatters和$parsers的转换函数(unshift、push)。同时在这里也是做数据验证的最佳时机,能够转换意味应该是合法的数据。

同时,我们也可以利用Angular指令的reuqire来获取到这个ngModelController。如下方式来使用它的$parses和$formaters:

.directive('textTransform', [function() {
  return {
    require: 'ngModel',
    link: function(scope, element, iAttrs, ngModelCtrl) {
      ngModelCtrl.$parsers.push(function(value) {
        ...
      });
      ngModelCtrl.$formatters.push(function(value) {
        ...
      });
    }
  };
}]);

因此,开篇所描述的输入控件的大写格式化,则可以利用ngModelController实现,在对于View文字大小的格式化,这个特殊的场景下,利用css特性text-transform会更简单。所以实现如下:

.directive('textTransform', function() {
   var transformConfig = {
     uppercase: function(input){
       return input.toUpperCase();
     },
     capitalize: function(input){
       return input.replace(
         /([a-zA-Z])([a-zA-Z]*)/gi,
         function(matched, $1, $2){
          return $1.toUpperCase() + $2;
        });
     },
     lowercase: function(input){
       return input.toLowerCase();
     }
   };
  return {
    require: 'ngModel',
    link: function(scope, element, iAttrs, modelCtrl) {
      var transform = transformConfig[iAttrs.textTransform];
      if(transform){
        modelCtrl.$parsers.push(function(input) {
          return transform(input || "");
        }); 
        element.css("text-transform", iAttrs.textTransform);
      }
    }
  };
});

则,在HTML就可以如下方式使用指令:

<input type="text" ng-model="demo.text" text-transform="capitalize" />
<input type="text" ng-model="demo.text" text-transform="uppercase" />
<input type="text" ng-model="demo.text" text-transform="lowercase" />

效果参见jsbin demo: http://jsbin.com/baqaso/edit?html,js,output

在这里利用了css text-transform特性,对于其它的方式,我们可以使用keydown、keyup、keypress等来实现。如inputMask和ngmodel-format。

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
javascript instanceof,typeof的区别
Mar 24 Javascript
JQuery显示、隐藏div的几种方法简明总结
Apr 16 Javascript
js实现a标签超链接提交form表单的方法
Jun 24 Javascript
jQuery对JSON数据进行排序输出的方法
Jun 24 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
Dec 02 Javascript
浅析在javascript中创建对象的各种模式
May 06 Javascript
JS留言功能的简单实现案例(推荐)
Jun 23 Javascript
用AngularJS来实现监察表单按钮的禁用效果
Nov 02 Javascript
自己封装的一个原生JS拖动方法(推荐)
Nov 22 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
Mar 15 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
Jul 18 Javascript
使用JS组件实现带ToolTip验证框的实例代码
Aug 23 Javascript
AngularJS自定义插件实现网站用户引导功能示例
Nov 07 #Javascript
webpack常用配置项配置文件介绍
Nov 07 #Javascript
jQuery Mobile和HTML5开发App推广注册页
Nov 07 #Javascript
学习JavaScript图片预加载模块
Nov 07 #Javascript
pc加载更多功能和移动端下拉刷新加载数据
Nov 07 #Javascript
jquery html5 视频播放控制代码
Nov 06 #Javascript
js无提示关闭浏览器窗口的两种方法分析
Nov 06 #Javascript
You might like
业余方法DIY电子管FM收音机
2021/03/02 无线电
WordPress中设置Post Type自定义文章类型的实例教程
2016/05/10 PHP
Laravel源码解析之路由的使用和示例详解
2018/09/27 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
超清晰的document对象详解
2007/02/27 Javascript
javascript removeChild 使用注意事项
2009/04/11 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
Javascript实现字数统计
2015/07/03 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
2015/09/06 Javascript
基于Arcgis for javascript实现百度地图ABCD marker的效果
2015/09/12 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
分享十三个最佳JavaScript数据网格库
2017/04/07 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
利用vue+elementUI实现部分引入组件的方法详解
2017/11/22 Javascript
javascript前端实现多视频上传
2020/12/13 Javascript
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python深入学习之装饰器
2014/08/31 Python
Python中使用PIL库实现图片高斯模糊实例
2015/02/08 Python
详解Python3中的Sequence type的使用
2015/08/01 Python
python实现class对象转换成json/字典的方法
2016/03/11 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
Python socket非阻塞模块应用示例
2019/09/12 Python
为什么是 Python -m
2020/06/19 Python
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
应用电子技术专业个人求职信
2013/09/21 职场文书
在校大学生个人的自我评价
2014/02/13 职场文书
40岁生日感言
2014/02/15 职场文书
机电一体化专业求职信
2014/07/22 职场文书
求职简历自我评价范文
2015/03/10 职场文书
导游词之安徽九华山
2019/09/18 职场文书
Python数据分析之pandas读取数据
2021/06/02 Python
logback 实现给变量指定默认值
2021/08/30 Java/Android
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js