Angularjs之filter過濾器(推薦)_AngularJS

來源:互聯網
上載者:User

現在公司用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也是nanreturn 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也是nanreturn 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>

以上所述是小編給大家介紹的Angularjs之filter過濾器,希望對大家有所協助,如果大家有任何疑問歡迎給我留言,小編會及時回複大家的,在此也非常感謝大家對雲棲社區網站的支援!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.