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 相关文章推荐
在textarea文本域中显示HTML代码的方法
Mar 06 Javascript
jquery多行滚动/向左或向上滚动/响应鼠标实现思路及代码
Jan 23 Javascript
JS获得URL超链接的参数值实例代码
Jun 21 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
Dec 16 Javascript
jquery实现预览提交的表单代码分享
May 21 Javascript
详解Document.Cookie
Dec 25 Javascript
jquery实现可旋转可拖拽的文字效果代码
Jan 27 Javascript
Angular实现的简单查询天气预报功能示例
Dec 27 Javascript
详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
Oct 26 Javascript
浅谈JavaScript 代码简洁之道
Jan 09 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
Jan 24 Javascript
vue data对象重新赋值无效(未更改)的解决方式
Jul 24 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文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
常用的PHP数据库操作方法(MYSQL版)
2011/06/08 PHP
PHP会话控制:Session与Cookie详解
2014/09/27 PHP
Laravel中使用阿里云OSS Composer包分享
2015/02/10 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
Composer设置忽略版本匹配的方法
2016/04/27 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
2016/12/15 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
从新浪弄下来的全屏广告代码 与使用说明
2007/03/15 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
JS实现图片垂直居中显示小结
2016/12/13 Javascript
Angular 常用指令实例总结整理
2016/12/13 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
基于vue2.0+vuex的日期选择组件功能实现
2017/03/13 Javascript
清空元素html(&quot;&quot;) innerHTML=&quot;&quot; 与 empty()的区别和应用(推荐)
2017/08/14 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
vue组件生命周期详解
2017/11/07 Javascript
jquery animate动画持续运动的实例
2017/11/29 jQuery
Vue2.0生命周期的理解
2018/08/20 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
浅谈python中的数字类型与处理工具
2017/08/02 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
2017/11/15 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
tornado+celery的简单使用详解
2019/12/21 Python
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
新闻记者实习自我鉴定
2013/09/19 职场文书
汉语言文学毕业生求职信
2013/10/01 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
同学会感言
2015/07/30 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python