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 学习笔记(八)javascript对象
Apr 12 Javascript
jQuery表单验证插件formValidator(改进版)
Feb 03 Javascript
js判断一个元素是否为另一个元素的子元素的代码
Mar 21 Javascript
JS判断不能为空实例代码
Nov 26 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
Dec 07 Javascript
Javascript实现鼠标框选操作  不是点击选取
Apr 14 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
Aug 02 Javascript
微信小程序防止多次点击跳转(函数节流)
Sep 19 Javascript
jQuery实现滑动星星评分效果(每日分享)
Nov 13 jQuery
Vue 图片压缩并上传至服务器功能
Jan 15 Javascript
Vue如何实现监听组件原生事件
Jul 03 Javascript
Vue 401配合Vuex防止多次弹框的案例
Nov 11 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
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
简单实用的PHP防注入类实例
2014/12/05 PHP
windows8.1下Apache+Php+MySQL配置步骤
2015/10/30 PHP
php实现每日签到功能
2018/11/29 PHP
基于JavaScript实现 获取鼠标点击位置坐标的方法
2013/04/12 Javascript
用js的for循环获取radio选中的值
2013/10/21 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
PHP7新特性简述
2017/06/11 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
python的keyword模块用法实例分析
2015/06/30 Python
pandas DataFrame的修改方法(值、列、索引)
2019/08/02 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
python如何对链表操作
2020/10/10 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
Pycharm Plugins加载失败问题解决方案
2020/11/28 Python
管道维修工岗位职责
2013/12/27 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
社区先进事迹材料
2014/05/19 职场文书
教师三严三实对照检查材料
2014/09/25 职场文书
给老婆的保证书
2015/01/16 职场文书
会计工作态度自我评价
2015/03/06 职场文书
介绍信格式样本
2015/05/05 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA