首页 > 代码库 > angularjs之filter过滤器

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 ljyage 27stature 165name nickage 25stature 170name xzlage 27stature 175name zyhage 29stature 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 zyhage 29stature 165name xzlage 27stature 175name ljyage 27stature 165name nickage 25stature 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 zyhage 29stature 165name xzlage 27stature 175name ljyage 27stature 165name nickage 25stature 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 nickage 25stature 170name ljyage 27stature 165name xzlage 27stature 175name zyhage 29stature 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 nickage 25stature 170name xzlage 27stature 175name ljyage 27stature 165name zyhage 29stature 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,若有偏差,望大神指正!

 

angularjs之filter过滤器