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 IE 与 FF中兼容问题小结
Feb 18 Javascript
JQuery从头学起第一讲
Jul 04 Javascript
JavaScript浏览器选项卡效果
Aug 25 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
Jul 31 Javascript
前端开发过程中浏览器版本的两种判定方法
Oct 30 Javascript
浅谈js的setInterval事件
Dec 05 Javascript
JavaScript中对JSON对象的基本操作示例
May 21 Javascript
bootstrap PrintThis打印插件使用详解
Feb 20 Javascript
Vue.js图片预览插件使用详解
Aug 27 Javascript
vue动态绑定class选中当前列表变色的方法示例
Dec 19 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
May 16 Javascript
javascript单张多张图无缝滚动实例代码
May 10 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 unset全局变量运用问题的深入解析
2013/06/17 PHP
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
PHP里的单例类写法实例
2015/06/25 PHP
php实现简易聊天室应用代码
2015/09/23 PHP
PHP 实现链式操作
2021/03/09 PHP
JScript中使用ADODB.Stream判断文件编码的代码
2008/06/09 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
JavaScript函数节流概念与用法实例详解
2016/06/20 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
webpack4.x打包过程详解
2018/07/18 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
angularJs中orderBy筛选以及filter过滤数据的方法
2018/09/30 Javascript
详解vue中axios请求的封装
2019/04/08 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
微信小程序实现通讯录列表展开收起
2020/11/18 Javascript
Python 深入理解yield
2008/09/06 Python
详解Python中的循环语句的用法
2015/04/09 Python
python中退出多层循环的方法
2018/11/27 Python
解决python 找不到module的问题
2020/02/12 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
python能否java成为主流语言吗
2020/06/22 Python
windows支持哪个版本的python
2020/07/03 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
Audible英国:有声读物,30天免费试用
2019/10/16 全球购物
编辑求职信样本
2013/12/16 职场文书
大学社团活动策划书
2014/01/26 职场文书
幼儿园评语大全
2014/04/17 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
Python利用capstone实现反汇编
2022/04/06 Python
MySQL数据库查询之多表查询总结
2022/08/05 MySQL