• angularjs之filter过滤器


      现在公司用ionic,就是基于angularjs封装了一些api用于webapp,最近用的angularjs的filter确实省了很多代码,现在总结一下!

      ng比较鸡肋的过滤器,这里就一笔带过吧!鸡汤类常用的filter后面上例子。

    lowercase(小写)

    {{ lastName | lowercase }}

    uppercase(大写)

    {{ lastName | uppercase }}

    number(格式化数字)

    number过滤器可以为一个数字加上千位分割,像这样,123,456,789。同时接收一个参数,可以指定小float型保留几位小数:

    {{ num | number : 2 }}

     currency (货币处理)

    {{num | currency : '¥'}}

    json(格式化json对象)

    {{ jsonTest | json}}

      作用就和我们熟悉的JSON.stringify()一样

     limitTo(限制数组长度或字符串长度)

    {{ childrenArray | limitTo : 3 }}  //将会显示数组中的前3项

    filter(匹配子串)

      用来处理一个数组,然后可以过滤出含有某个子串的元素,作为一个子数组来返回。可以是字符串数组,也可以是对象数组。如果是对象数组,可以匹配属性的值。它接收一个参数,用来定义子串的匹配规则。

    html

    <ul>
            <li>filter 匹配子串(以下写法只是方便观察)</li>
            <li>{{ webArr | filter : 'n' }} <!--匹配属性值中含有n的--></li>
            <li>{{ webArr | filter : 25 }} <!--匹配属性值中含有25的--></li>
            <li>{{ webArr | filter : {name : 'l'} }} <!--//参数是对象,匹配name属性中含有l的--></li>
            <li>{{ webArr | filter : fun }} <!--/参数是函数,指定返回age>25的--></li>
    </ul>

    js

    $scope.webArr = [
                        {name:'nick',age:25},
                        {name:'ljy',age:28},
                        {name:'xzl',age:28},
                        {name:'zyh',age:30}
                    ];
    $scope.fun = function(e){return e.age>25;};

     效果展示:

    filter 匹配子串(以下写法只是方便观察)
    [{"name":"nick","age":25}]
    [{"name":"nick","age":25}]
    [{"name":"ljy","age":28},{"name":"xzl","age":28}]
    [{"name":"ljy","age":28},{"name":"xzl","age":28},{"name":"zyh","age":30}]

    日期类

      日期过滤器应该是常用过滤器中最简单的吧!

    • yyyy--表示年份;
    • MM--月份(必须大写);
    • dd--日期;
    • hh--时;
    • mm--分(必须小写);
    • ss--秒;
    • EEEE--星期;
    • hh:mm--形式是24小时制;
    • h:mma--12小时制;
    • 其中年、月、日、时、分、秒 或  / : - 等自己试做搭配吧!
        <ul>
            <li>8 日期1</li>
            <li ng-bind="date|date:'yyyy/MM/dd hh:mm:ss EEEE'"></li>
            <li>8 日期2</li>
            <li ng-bind="date|date:'yyyy年MM月dd日 h:mma EEEE'"></li>
            <li>8 日期3</li>
            <li ng-bind="date|date:'yyyy年MM月dd日 hh时mm分ss秒'"></li>
            <li>8 日期4</li>
            <li ng-bind="date|date:'yyyy/MM/dd hh:mm:ss'"></li>
        </ul>

    日期1的显示效果:

    2016/11/19 11:59:05 Saturday

    日期2的显示效果:

    2016年11月19日 12:01PM Saturday

    日期3的显示效果:

    2016年11月22日 10时42分09秒

    日期4的显示效果:

    2016/11/22 11:16:58

     orderBy排序(个人认为第七例最佳写法)

    ng-repeat生成一个独立的scope作用域,直接在ng-repeat循环后加管道orderBy排序。

    用法很简单,但有坑需注意两点:

    • 参数引号勿忘;
    • 参数形式--直接写成age,不用写成item2.age。

    3 按年龄排序(默认升序)

        <ul>
            <li>3 按年龄排序(默认升序)</li>
            <li ng-repeat="item2 in items2|orderBy:'age'">
                <div>
                    <b>name</b>
                    <u ng-bind="item2.name"></u>
                </div>
                <div>
                    <b>age</b>
                    <i ng-bind="item2.age"></i>
                </div>
                <div>
                    <b>stature</b>
                    <i ng-bind="item2.stature"></i>
                </div>
            </li>
        </ul>

    效果展示:

    3 按年龄排序(默认升序)
    name ljy
    age 27
    stature 165
    name nick
    age 25
    stature 170
    name xzl
    age 27
    stature 175
    name zyh
    age 29
    stature 165

    4 按年龄排序(加参数true则为倒序即降序)

        <ul>
            <li ng-repeat="item2 in items2|orderBy:'age':true">
                <div>
                    <b>name</b>
                    <u ng-bind="item2.name"></u>
                </div>
                <div>
                    <b>age</b>
                    <i ng-bind="item2.age"></i>
                </div>
                <div>
                    <b>stature</b>
                    <i ng-bind="item2.stature"></i>
                </div>
            </li>
        </ul>

    效果展示:

    4 按年龄排序(加参数true则为倒序即降序)
    name zyh
    age 29
    stature 165
    name xzl
    age 27
    stature 175
    name ljy
    age 27
    stature 165
    name nick
    age 25
    stature 170
    5 想先按年龄升序在按身高降序(全是降序了,达不到效果,见第7例)
    我曾就天真的这样写过^*^
        <ul>
            <!--<li ng-repeat="item2 in items2|orderBy:'age':'-stature'">-->
            <li ng-repeat="item2 in items2|orderBy:'age':'stature':true">
                <div>
                    <b>name</b>
                    <u ng-bind="item2.name"></u>
                </div>
                <div>
                    <b>age</b>
                    <i ng-bind="item2.age"></i>
                </div>
                <div>
                    <b>stature</b>
                    <i ng-bind="item2.stature"></i>
                </div>
            </li>
        </ul>

    效果展示:

    5 想先按年龄升序在按身高降序(全是降序了,达不到效果,见第7例)
    name zyh
    age 29
    stature 165
    name xzl
    age 27
    stature 175
    name ljy
    age 27
    stature 165
    name nick
    age 25
    stature 170

    6 先按年龄在按身高排序(多个参数写出数组形式)

        <ul>
            <li ng-repeat="item2 in items2|orderBy:['age','stature']">
                <div>
                    <b>name</b>
                    <u ng-bind="item2.name"></u>
                </div>
                <div>
                    <b>age</b>
                    <i ng-bind="item2.age"></i>
                </div>
                <div>
                    <b>stature</b>
                    <i ng-bind="item2.stature"></i>
                </div>
            </li>
        </ul>

    效果展示:

    6 先按年龄在按身高排序(多个参数写出数组形式)
    name nick
    age 25
    stature 170
    name ljy
    age 27
    stature 165
    name xzl
    age 27
    stature 175
    name zyh
    age 29
    stature 165

    7 先按年龄升序在按身高降序(多个参数写出数组形式)

      在参数前加负号即可实现倒序

        <ul>
            <li ng-repeat="item2 in items2|orderBy:['age','-stature']">
                <div>
                    <b>name</b>
                    <u ng-bind="item2.name"></u>
                </div>
                <div>
                    <b>age</b>
                    <i ng-bind="item2.age"></i>
                </div>
                <div>
                    <b>stature</b>
                    <i ng-bind="item2.stature"></i>
                </div>
            </li>
        </ul>

    效果展示:

    !!7 先按年龄升序在按身高降序(多个参数写出数组形式)
    name nick
    age 25
    stature 170
    name xzl
    age 27
    stature 175
    name ljy
    age 27
    stature 165
    name zyh
    age 29
    stature 165

    个人觉得ng内置的过滤器好多都比较鸡肋。个性化的需求自定义的过滤器吧。

    自定义过滤器

    自定义过滤器就是返回一个函数,函数又返回你要的值即可!

    实例:

    angular.module('youAppName',[])
                    .filter('youFilterName',function(){
                        return function(){
                          //你的处理代码
                            return result;//返回你要的值
                        }
                    })

    自定义一个求和的过滤器

    html

        <ul>
            <li>!!1 求和</li>
            <li ng-repeat="item1 in items1">
                <div ng-bind="item1.male | sumNick:item1.female:item1.gay"></div>
            </li>
        </ul>

    用法:

    管道前后所有参数即为和

    js

    var nickAppModule=angular.module('nickApp',[]);
            nickAppModule
                    //求和
                    .filter('sumNick',function(){
                        return function(){
                            var arr=Array.prototype.slice.call(arguments),sum=0;
                            for(var i= 0,len=arr.length;i<len;i++){
                                sum+=arr[i]?arr[i]:0;
                            }
                            return sum;
                        }
                    })

    arguments--函数接受的参数集合,类数组;

    Array.prototype.slice.call(arguments)

    这句将类数组转为数组; 

     sum+=arr[i]?arr[i]:0;

      总和sum等于数组的每个元素累加的和。避免后台为传值,而又将次参数传人自定义filer函数作为参数,容错时写成0保险。

      自定义一个求百分百的过滤器(求保留小数点后两位百分比)

    html

        <ul ng-repeat="item1 in items1">
            <li>!!2 求百分比</li>
            <li>
                <b>male</b>
                <i ng-bind="item1.male|percentNick:item1.female:item1.gay"></i>
            </li>
            <li>
                <b>female</b>
                <u ng-bind="item1.female|percentNick:item1.male:item1.gay"></u>
            </li>
            <li>
                <b>gay</b>
                <s ng-bind="item1.gay|percentNick:item1.female:item1.male"></s>
            </li>
        </ul>

    用法:

     分子写在管道前面,管道后面的所有参数和加管道前的参数和则为分母

    js

    var nickAppModule=angular.module('nickApp',[]);
            nickAppModule
    //百分比
                    .filter('percentNick',function(){
                        return function(){
                            var arr=Array.prototype.slice.call(arguments),sum=0;
                            for(var i= 0,len=arr.length;i<len;i++){
                                sum+=arr[i]?arr[i]:0;
                            }
                            //0/0也是nan
                            return sum==0?'0%':Math.round((arr[0]?arr[0]:0)/sum*10000)/100+"%";
                        }
                    })

    这里就是在上面求和的filter上多了一句:

    sum==0?'0%':Math.round((arr[0]?arr[0]:0)/sum*10000)/100+"%"

      Math内置函数,Math.round四舍五入保留整数;

      将总和乘以10000除以100拼接百分比号,即保留两位小数。

    完整代码:

    <!DOCTYPE html>
    <html lang="zh-CN" ng-app="nickApp">
    <head>
        <meta charset="UTF-8">
        <title>ng filter nick</title>
    </head>
    <body ng-controller="nickCtrl">
        <ul>
            <li>!!1 求和</li>
            <li ng-repeat="item1 in items1">
                <div ng-bind="item1.male | sumNick:item1.female:item1.gay"></div>
            </li>
        </ul>
        <ul ng-repeat="item1 in items1">
            <li>!!2 求百分比</li>
            <li>
                <b>male</b>
                <i ng-bind="item1.male|percentNick:item1.female:item1.gay"></i>
            </li>
            <li>
                <b>female</b>
                <u ng-bind="item1.female|percentNick:item1.male:item1.gay"></u>
            </li>
            <li>
                <b>gay</b>
                <s ng-bind="item1.gay|percentNick:item1.female:item1.male"></s>
            </li>
        </ul>
        <ul>
            <li>3 按年龄排序(默认升序)</li>
            <li ng-repeat="item2 in items2|orderBy:'age'">
                <div>
                    <b>name</b>
                    <u ng-bind="item2.name"></u>
                </div>
                <div>
                    <b>age</b>
                    <i ng-bind="item2.age"></i>
                </div>
                <div>
                    <b>stature</b>
                    <i ng-bind="item2.stature"></i>
                </div>
            </li>
        </ul>
        <ul>
            <li>4 按年龄排序(加参数true则为倒序即降序)</li>
            <li ng-repeat="item2 in items2|orderBy:'age':true">
                <div>
                    <b>name</b>
                    <u ng-bind="item2.name"></u>
                </div>
                <div>
                    <b>age</b>
                    <i ng-bind="item2.age"></i>
                </div>
                <div>
                    <b>stature</b>
                    <i ng-bind="item2.stature"></i>
                </div>
            </li>
        </ul>
        <ul>
            <li>5 想先按年龄升序在按身高降序(全是降序了,达不到效果,见第7例)</li>
            <!--<li ng-repeat="item2 in items2|orderBy:'age':'-stature'">-->
            <li ng-repeat="item2 in items2|orderBy:'age':'stature':true">
                <div>
                    <b>name</b>
                    <u ng-bind="item2.name"></u>
                </div>
                <div>
                    <b>age</b>
                    <i ng-bind="item2.age"></i>
                </div>
                <div>
                    <b>stature</b>
                    <i ng-bind="item2.stature"></i>
                </div>
            </li>
        </ul>
        <ul>
            <li>6 先按年龄在按身高排序(多个参数写出数组形式)</li>
            <li ng-repeat="item2 in items2|orderBy:['age','stature']">
                <div>
                    <b>name</b>
                    <u ng-bind="item2.name"></u>
                </div>
                <div>
                    <b>age</b>
                    <i ng-bind="item2.age"></i>
                </div>
                <div>
                    <b>stature</b>
                    <i ng-bind="item2.stature"></i>
                </div>
            </li>
        </ul>
        <ul>
            <li>!!7 先按年龄升序在按身高降序(多个参数写出数组形式)</li>
            <li ng-repeat="item2 in items2|orderBy:['age','-stature']">
                <div>
                    <b>name</b>
                    <u ng-bind="item2.name"></u>
                </div>
                <div>
                    <b>age</b>
                    <i ng-bind="item2.age"></i>
                </div>
                <div>
                    <b>stature</b>
                    <i ng-bind="item2.stature"></i>
                </div>
            </li>
        </ul>
        <ul>
            <li>8 日期1</li>
            <li ng-bind="date|date:'yyyy/MM/dd hh:mm:ss EEEE'"></li>
            <li>2016/11/19 11:59:05 Saturday</li>
            <li>8 日期2</li>
            <li ng-bind="date|date:'yyyy年MM月dd日 h:mma EEEE'"></li>
            <li>2016年11月19日 12:01PM Saturday</li>
            <li>8 日期3</li>
            <li ng-bind="date|date:'yyyy年MM月dd日 hh时mm分ss秒'"></li>
            <li>2016年11月22日 10时42分09秒</li>
            <li>8 日期4</li>
            <li ng-bind="date|date:'yyyy/MM/dd hh:mm:ss'"></li>
            <li>2016/11/22 11:16:58</li>
        </ul>
        <div>{{100000|currency:'¥'}}<!--¥可以写成$或其他--></div>
        <ul>
            <li>filter 匹配子串(以下写法只是方便观察)</li>
            <li>{{ webArr | filter : 'n' }} <!--匹配属性值中含有n的--></li>
            <li>{{ webArr | filter : 25 }} <!--匹配属性值中含有25的--></li>
            <li>{{ webArr | filter : {name : 'l'} }} <!--//参数是对象,匹配name属性中含有l的--></li>
            <li>{{ webArr | filter : fun }} <!--/参数是函数,指定返回age>25的--></li>
        </ul>
        <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
        <script>
            var nickAppModule=angular.module('nickApp',[]);
            nickAppModule
                    //求和
                    .filter('sumNick',function(){//管道前后所有参数和
                        return function(){
                            var arr=Array.prototype.slice.call(arguments),sum=0;
                            for(var i= 0,len=arr.length;i<len;i++){
                                sum+=arr[i]?arr[i]:0;
                            }
                            return sum;
                        }
                    })
                    //百分比
                    .filter('percentNick',function(){//小数点后两位百分比 分子写在管道前面,管道后面的所有参数和加管道前的参数和为分母
                        return function(){
                            var arr=Array.prototype.slice.call(arguments),sum=0;
                            for(var i= 0,len=arr.length;i<len;i++){
                                sum+=arr[i]?arr[i]:0;
                            }
                            //0/0也是nan
                            return sum==0?'0%':Math.round((arr[0]?arr[0]:0)/sum*10000)/100+"%";
                        }
                    })
        </script>
    <script>
        nickAppModule
                .controller('nickCtrl',['$scope',function($scope){
                    $scope.items1=[{
                        male:66,
                        female:23,
                        gay:5,
                        other:'xxx',
                        msg:'xxx'
                    },
                        {
                            male:16,
                            female:8,
                            gay:7,
                            other:'xxx',
                            msg:'xxx'
                        }];
                    $scope.items2=[
                        {
                            name:'ljy',
                            age:27,
                            stature:165
                        },
                        {
                            name:'nick',
                            age:25,
                            stature:170
                        },
                        {
                            name:'xzl',
                            age:27,
                            stature:175
                        },
                        {
                            name:'zyh',
                            age:29,
                            stature:165
                        }];
                    $scope.date=new Date();
                    $scope.webArr = [
                        {name:'nick',age:25},
                        {name:'ljy',age:28},
                        {name:'xzl',age:28},
                        {name:'zyh',age:30}
                    ];
                    $scope.fun = function(e){return e.age>25;};
                }])
    
    </script>
    </body>
    </html>
    View Code

    个人能力有限,浅显的总结了下ng filter,若有偏差,望大神指正!

     

  • 相关阅读:
    hdu 1272 小希的迷宫
    hdu 1318 Palindromes
    ANR traces中内存占用情况解读
    请教会linux shell脚本的=~是什么意思?
    kernel struct definition location
    SecureCRT sysrq键设置
    sysrq
    Linux中断管理 (1)Linux中断管理机制【转】
    Linux suspend 流程介绍(2)之 freeze task
    Linux进程状态解析 之 R、S、D、T、Z、X (主要有三个状态)
  • 原文地址:https://www.cnblogs.com/puyongsong/p/6091666.html
Copyright © 2020-2023  润新知