AngularJS--过滤器

过滤器

  1. 过滤器用来格式化需要展示给用户的数据;
  2. 在HTML中的模板绑定符号{{ }}内通过|符号来调用过滤器,比如希望字符串转换成大写,可以对字符串中的每个字符单独进行转换操作,也可以使用过滤器;
    {{ name | uppercase }}
  3. 以HTML的形式使用过滤器时,如果需要传递参数给过滤器,只需要在过滤器名字后面加冒号即可;如果有多个参数,可以在每个参数后面都加入冒号;
    {{ 123.456789 | number:2 }}
  4. 可以用|符号作为分割符来同时使用多个过滤器;
  5. 在JavaScript代码中可以通过$filter来调用过滤器,比如在代码中使用lowercase过滤器;
app.controller('DemoController',['$scope','$filter',function($scope, $filter) {
    $scope.name = $filter('lowercase')('Cherry');
}]);

Angular内置过滤器

  1. currency:将一个数值格式化为货币格式,currency过滤器允许我们自己设置货币符号,默认采用客户端所处地区的货币符号;
  2. date:将日期格式化成需要的格式,如果没有指定使用任何格式,默认会采用mediumDate格式;
  3. filter:从给定数组中选择一个子集,并将其生成一个新数组返回,通常用来过滤需要进行展示的元素;filter过滤器的第一个参数可以是:
    ~字符串:返回所有包含这个字符串的元素,如果想返回不包含该字符串的元素,在参数前加!符号;
    ~对象:AngularJS会将待过滤对象的属性同这个对象中的同名属性进行比较,如果属性值是字符串就会判断是否包含该字符串,如果我们希望对全部属性都进行比较,可以将$当作键名;
    ~函数:对每个元素都执行这个函数,返回非假值的元素会出现在新的数组中并返回;
    ~true:用angular.equals(expected, actual)对两个值进行严格比较;
    ~false:进行区分大小写的子字符串比较;
  4. json:将一个JSON或JavaScript对象转换成字符串,这种转换对调试非常有帮助;
    {{ {'name': 'Cherry': 'Shanghai'} | json}}
    ={ "name": "Cherry", "City": "Shanghai" }
  5. limitTo:根据传入的参数生成一个新的数组或字符串,新的数组或字符串的长度取决于传入的参数,通过传入参数的正负值来控制从前面还是从后面开始截取;
    {{ San Francisco is very cloudy | limitTo:3 }} >> San
    {{ San Francisco is very cloudy | limitTo:-6 }} >> cloudy
    {{ ['a','b','c','d','e','f'] | limitTo:1 }} >> "a"
  6. lowercase:将字符串转为小写;
    {{ San Francisco is very cloudy | lowercase }} >> san francisco is very cloudy
  7. number:将数字格式化成文本,第二个参数是可选的,用来控制小数点后截取的位数;
    {{ 123456789 | number }} >> 1,234,567,890
    {{ 1.234567 | number:2 }} >> 1.23
  8. orderBy:可以用表达式对指定的数组进行排序;orderBy过滤器接受两个参数,第一个是必需的(用来确定数组排序方向的谓词),第二个是可选的:
    ~函数:当第一个参数是函数时,该函数会被当作待排序对象的getter方法;
    ~字符串:对这个字符串进行解析的结果将决定数组元素的排序方向,可以传入+或-来强制进行升序或降序排序;
    ~数组:在排序表达式中使用数组元素作为谓词;
  9. uppercase:将字符串转为大写;

    自定义过滤器

    创建自定义过滤器需要将它放到自己的模块中

//过滤器本质上是一个会把输入的内容当作参数传入进去的函数
angular.module('myApp.filters', [])
.filter('capitalize', function(){
    return function(input) {
        //input是传入的字符串
        if (input) {
            return input[0].toUpperCase() + input.slice(1);
        };
    };
});
{{'ginger lovers dog treats' | lowercase | capitalize}}  
>> Ginger lovers dog treats

表单验证

  1. 根据用户在表单中输入的内容给出实时视觉反馈是非常重要的;
  2. 表单验证不仅能给用户提供有用的反馈,同时也能保护Web应用不会被恶意或者错误的输入所破坏,Web前端要尽力保护后端;
  3. AngularJS提供了很多表单验证指令,要使用表单验证首先要有一个name属性,如果要屏蔽浏览器对表单的默认验证行为,可以在表单元素上添加novalidate标记:
<form name="form" novalidate>
    <label name="email">Your email</label>
    <input name="email" type="email" ng-model="email" placeholder="Email Address" />
</form>
  1. input元素上使用的所有验证选项:
    必选项:验证某个表单输入是否已填写,在输入字段元素添加HTML5标记required即可,如:
    <input type="text" required />
    最小长度:验证表单输入的文本长度是否大于某个最小值,在输入字段上使用指令ng-minlength=”{number}”,如:
    <input type="text" ng-minlength="5" />
    最大长度:验证表单输入的文本长度是否小于或等于某个最大值,在输入字段上使用ng-maxlength=”{number}“,如:
    <input type="text" ng-maxlength="16" />
    模式匹配:使用ng-pattern=”/PATTERN/“来确保输入能够匹配指定的正则表达式,如:
    <input type="text" ng-pattern="[a-zA-Z]" />
    电子邮件:验证输入内容是否为电子邮件,将input类型设置为email,如:
    <input type="email" name="email" ng-model="user.email" />
    数字:验证输入的是否为数字,将input类型设置为number,如:
    <input type="number" name="age" ng-model="user.age" />
    URL: 验证输入的是否为URL,将input类型设置为url,如:
    <input type="url" name="homepage" ng-model="user.facebook_url" />
    自定义验证
    在表单中控制变量:表单的属性可以在其所属的 scope访访 scope对象,因此JavaScript可以间接地访问DOM中的表单属性;借助这些属性,可以对表单作出实时响应;主要有以下属性:(通过formName.inputFieldName.property格式访问这些属性)
    1.未修改的表单: 用来判断用户是否修改了表单,未修改为true;
    formName.inputFieldName.$pristine
    2.修改过的表单 :只要用户修改过表单,无论输入是否通过验证,都返回true;
    formName.inputFieldName.$dirty
    3.合法的表单:判断表单的内容是否合法,合法为true;
    formName.inputFieldName.$valid
    4.不合法的表单 :判断表单的内容是否不合法,不合法为true;
    formName.inputFieldName.$invalid
    5.错误:$error对象,它包含当前表单的所有验证内容,以及它们是否合法的信息,如果验证失败为true,输入字段通过验证为false;
    formName.inputFieldName.$error
    一些有用的CSS样式
    1. AngularJS处理表单时,会根据表单当前的状态添加一些CSS类:
      .ng-pristine { }
      .ng-dirty { }
      .ng-valid { }
      .ng-error { }
    2. $parsers:当用户同控制器进行交互,并且ngModelController中的setViewValue()方法被调用时,parsers数组中的函数会以流水线的形式被逐个调用,可以对输入值进行转换,或者通过setValidity()函数设置表单的合法性;使用parsers数组是实现自定义验证的途径之一;
    3. $formatters:当绑定的ngModel值发生了变化,并经过parsers数组中解析器的处理后,这个值会被传递给formatters流水线;formatters中的函数也可以修改并格式化这些值;这些函数通常用来处理视图中的可视变化;

组合实例,一个注册表单:

form.html

<!DOCTYPE html>
<html  ng-app="app">
<head>
    <title>Sign Up</title>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.13/angular.js"></script>
</head>
<body>
    <form name="signup_form" novalidateng-submit="signupForm()">
        <fieldset>
            <legend>Signup</legend>
            <!-- Your name -->
            <div class="row">
                <div class="large-12 columns">
                    <label>Your name</label>
                    <input type="text" placeholder="Name" name="name" ng-model="signup.name" ng-minlength="3" ng-maxlength="20" required />
                    <div class="error" ng-show="signup_form.name.$dirty $$ signup_form.name.$invalid">
                        <small class="error" ng-show="signup_form.name.$error.required">
                            Your name is required.
                        </small>
                        <small class="error" ng-show="signup_form.name.$error.minlength">
                            Your name is required to be at leasr 3 characters.
                        </small>
                        <small class="error" ng-show="signup_form.name.$error.maxlength">
                            Your name cannot bu longer than 20 characters.
                        </small>
                    </div>
                </div>
            </div>

            <!-- User Email -->
            <div class="row">
                <div class="large-12 columns">
                    <label>Your email</label>
                    <input type="email" placeholder="Email" name="email" ng-model="signup.email" ng-minlength="3" ng-maxlength="20" required />
                    <div class="error" ng-show="signup_form.email.$dirty $$ signup_form.email.$invalid">
                        <small class="error" ng-show="signup_form.email.$error.required">
                            Your email is required.
                        </small>
                        <small class="error" ng-show="signup_form.email.$error.minlength">
                            Your email is required to be at leasr 3 characters.
                        </small>
                        <small class="error" ng-show="signup_form.email.$error.email">
                            That is not a valid email. Please input a valid email.
                        </small>
                        <small class="error" ng-show="signup_form.email.$error.maxlength">
                            Your email cannot bu longer than 20 characters.
                        </small>
                    </div>
                </div>
            </div>

            <!-- User name -->
            <div class="row">
                <div class="large-12 columns">
                    <label>Username</label>
                    <input type="text" placeholder="Desired username" name="username" ng-model="signup.username" ng-minlength="3" ng-maxlength="20" required />
                    <div class="error" ng-show="signup_form.username.$dirty $$ signup_form.username.$invalid">
                        <small class="error" ng-show="signup_form.username.$error.required">
                            Please input a username.
                        </small>
                        <small class="error" ng-show="signup_form.username.$error.minlength">
                            Your username is required to be at leasr 3 characters.
                        </small>
                        <small class="error" ng-show="signup_form.username.$error.maxlength">
                            Your username cannot bu longer than 20 characters.
                        </small>
                        <small class="error" ng-show="signup_form.username.$error.unique">
                            That username is taken, please try another.
                        </small>
                    </div>
                </div>
            </div>
            <!--用ng-disabled指令基于表单的合法性来启用或禁用按钮-->
            <button type="button" ng-disabled="signup_form.$invalid" class="button radius">Submit</button>
        </fieldset>
    </form>
    <script type="text/javascript" src="form.js"></script>
</body>
</html>

form.js

var app = angular.module('app', []);
app.directive('ensureUnique', function($http){
    return {
        require: 'ngModel',
        link: function(scope, ele, attrs, c){
            scope.$watch(attrs.ngModel, function(n){
                if (!n) return;
                $http({
                    method: 'POST',
                    url: '/api/check/' + attrs.ensureUnique,
                    data: {
                        field: attrs.ensureUnique,
                        value: scope.ngModel
                    }
                }).success(function(data){
                    c.$setValidity('unique', data.isUnique);
                }).error(function(data){
                    c.$setValidity('unique', false);
                });
            });
        }
    };
});

有点不太好的用户体验,当用户还没有输入完,或者没有输入的时候,就会弹出错误信息,这让用户的心情会有点不爽!
木有输入任何文字时
正确输入时
输入错误时

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值