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 相关文章推荐
jquery validate使用攻略 第四步
Jul 01 Javascript
JS鼠标滑过图片时切换图片实现思路
Sep 12 Javascript
JS判断变量是否为空判断是否null
Jul 25 Javascript
js遍历子节点子元素附属性及方法
Aug 19 Javascript
js解决movebox移动问题
Mar 29 Javascript
用jmSlip编写移动端顶部日历选择控件
Oct 24 Javascript
Centos7 中 Node.js安装简单方法
Nov 02 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
Mar 06 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
Aug 23 jQuery
在layui.use 中自定义 function 的正确方法
Sep 16 Javascript
js对象属性名驼峰式转下划线的实例代码
Sep 17 Javascript
JavaScript实现外溢动态爱心的效果的示例代码
Mar 21 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学习之 认清变量的作用范围
2010/01/26 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
php判断字符串在另一个字符串位置的方法
2014/02/27 PHP
php获取QQ头像并显示的方法
2014/12/23 PHP
[原创]php实现数组按拼音顺序排序的方法
2017/05/03 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
2019/05/28 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
Javascript常考语句107条收集
2010/03/09 Javascript
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
2016/06/23 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
2017/01/29 Javascript
vue.js获取数据库数据实例代码
2017/05/26 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
ES6学习教程之块级作用域详解
2017/10/09 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
2019/04/10 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
JS+CSS实现过渡特效
2021/01/02 Javascript
Python进程通信之匿名管道实例讲解
2015/04/11 Python
关于python的bottle框架跨域请求报错问题的处理方法
2017/03/19 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
python支持多线程的爬虫实例
2019/12/21 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
深入开展党的群众路线教育实践活动方案
2014/02/04 职场文书
教师求职信范文
2014/05/24 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
学生病假条怎么写
2015/08/17 职场文书
2015新员工工作总结范文
2015/10/15 职场文书
MySQL infobright的安装步骤
2021/04/07 MySQL
Python实现自动玩连连看的脚本分享
2022/04/04 Python