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 迁移目录
Dec 18 Javascript
JQUERY获取form表单值的代码
Jul 17 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
Jan 23 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
Feb 11 Javascript
JavaScript中的原型和继承详解(图文)
Jul 18 Javascript
使用JavaScript 实现的人脸检测
Mar 24 Javascript
原生JS实现旋转木马式图片轮播插件
Apr 25 Javascript
用JS实现轮播图效果(二)
Jun 26 Javascript
JavaScript中数组slice和splice的对比小结
Sep 22 Javascript
微信小程序  http请求封装详解及实例代码
Feb 15 Javascript
Bootstrap 中data-[*] 属性的整理
Mar 13 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
Aug 09 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
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
document.compatMode的CSS1compat使用介绍
2014/04/03 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
深入理解JavaScript 函数
2016/06/06 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
快速掌握jQuery插件WebUploader文件上传
2016/11/07 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
使用npm安装最新版本nodejs
2018/01/18 NodeJs
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
jQuery实现获取及设置CSS样式操作详解
2018/09/05 jQuery
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
小程序登录态管理的方法示例
2018/11/13 Javascript
微信小程序云开发之模拟后台增删改查
2019/05/16 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
2019/08/02 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
Python实现的十进制小数与二进制小数相互转换功能
2017/10/12 Python
python list格式数据excel导出方法
2018/10/31 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
信号生成及DFT的python实现方式
2020/02/25 Python
python实现简单坦克大战
2020/03/27 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
Python批量处理csv并保存过程解析
2020/05/16 Python
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
幼儿园园长岗位职责
2013/11/26 职场文书
园林毕业生自我鉴定范文
2013/12/29 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
高三毕业感言
2015/07/30 职场文书
简历自我评价范文
2019/04/24 职场文书
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL