• 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拼接百分比号,即保留两位小数。

    完整代码:

     View Code

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

  • 相关阅读:
    【教程分享】嵌入式Linux+QT开发零基础入门+项目实战
    4412开发板图像识别项目-移植百度AI依赖库curl(三)
    8月10日学习日志
    每周进度汇总
    8月9日学习日志
    8月8日学习日志
    8月7日学习日志
    8月6日学习日志
    《大道至简》读后感
    8月5日学习日志
  • 原文地址:https://www.cnblogs.com/huilixieqi/p/6497111.html
Copyright © 2020-2023  润新知