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,若有偏差,望大神指正!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM