Angular 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等来实现。如inputMaskngmodel-format

作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/p/angular-input-box-format.html

时间: 2024-10-27 01:25:07

Angular Input格式化的相关文章

AngularJS实现Input格式化的方法_AngularJS

本文实例讲述了AngularJS实现Input格式化的方法.分享给大家供大家参考,具体如下: 今天在Angular中文群有位同学问到:如何实现对input box的格式化.如下的方式对吗? <input type="text" ng-model="demo.text | uppercase" /> 这当然是不对的.在Angular中filter(过滤器)是为了显示数据的格式,它将$scope上的Model数据格式化View显示的数据绑定到DOM之上.它并

C++中格式化输入输出(formatted input and output) 详解

格式化输入输出, 是在<iostream>的头文件中, 控制格式; 如果修改输入输出的格式, 会影响之后的格式, 需要重置, 一般在格式类型之前添加"no", 即可; 支持, 8进制, 16进制, 默认10进制, 以及大写(uppercase)模式; 代码: /* * cppprimer.cpp * * Created on: 2013.11.28 * Author: Caroline */ /*eclipse cdt, gcc 4.8.1*/ #include <i

angularjs-angularJS 有关于在input标签中格式化默认的值,并且能选其他时间。

问题描述 angularJS 有关于在input标签中格式化默认的值,并且能选其他时间. 现在已经格式化好了,但是不能选,求助. app.directive('dateFormat', ['$filter',function($filter) { var dateFilter = $filter('date'); return { require: 'ngModel', link: function(scope, elm, attrs, ctrl) { function formatter(va

angular无法获得input值的问题

问题描述 angular无法获得input值的问题 input标签中有一个id,我怎么才能用angularjs获取到我用jquery给id赋的值呢???急急急!!求大神们帮忙指点. 解决方案 没必要这么麻烦吧?直接在input标签里面定义一个ng-model属性,在代码里面获取这个model的值就可以了,例如: //这里假设是你的controller代码 $scope.val 就可以取到值了

Angular.js框架基础知识,来自Google的前端JavaScript框架

AngularJS 是一款来自 Google 的前端 JavaScript 框架,也是 SPA(single-page-application,单页应用)框架.AngularJS 框架的体积非常小,但是设计理念和功能却非常强大,极大地简化前端开发的负担,它快速成为了 JavaScript 的主流框架,帮助开发者从事 web 开发. SPA 和 MVC SPA:单页面应用是指用户通过浏览器加载独立的 HTML 页面并且无需离开此导航页面.对用户操作来说,一旦加载和执行单个页面应用程序通常会有更多的

angular框架

AngularJs 1.   表达式{{5+3}} 2.   指令  ng-app 指令初始化一个 AngularJS应用程序,ng-init指令初始化应用程序数据,ng-model 指令把元素值(比如输入域的值)绑定到应用程序,ng-if. 3.   控制器ng-controller                                                                                                          <

由浅入深剖析Angular表单验证_AngularJS

最近手上维护的组件剩下的BUG都是表单验证,而且公司的表单验证那块代码经历的几代人,里面的逻辑开始变得不清晰,而且代码结构不是很angular. 是很有必要深入了解表单验证. <body ng-controller="MainController"> <form name="form" novalidate="novalidate"> <input name="text" type="e

《AngularJS实战》——2.1  Angular中的表达式

2.1 Angular中的表达式 在Angular中,表达式是运用在视图中的一个段代码,例如在第1章的示例1-2中,在计算两个数据的和时,双花括号中就是一个数值表达式,其中的值是通过调用$parse服务模块进行解析的.如果需要格式化表达式中的值,也可以调用Angular中的过滤器,例如在第1章示例1-2中,管道符"|"之后的"number:0"则调用了整数型过滤器. 2.1.1 Angular表达式与JavaScript表达式的区别 虽然都是表达式,但Angular

AngularJs Understanding Angular Templates_AngularJS

angular template是一个声明规范,与model.controller的信息一起,渲染成用户在浏览器中所看到的视图.它是静态的DOM,包括HTML.CSS.angular特别的元素和angular指定的元素属性.angular元素和属性指示angular去扩展行为以及将template DOM转换为动态视图的DOM. 下面是我们可以在template中使用的angular元素已经元素属性的类型: Directive(http://www.jb51.net/article/91739.