實(shí)例解析angularjs的filter過濾器
現(xiàn)在公司用ionic,就是基于angularjs封裝了一些api用于webapp,最近用的angularjs的filter確實(shí)省了很多代碼,現(xiàn)在總結(jié)一下!
ng比較雞肋的過濾器,這里就一筆帶過吧!雞湯類常用的filter后面上例子。
lowercase(小寫)
{{ lastName | lowercase }}
uppercase(大寫)
{{ lastName | uppercase }}
number(格式化數(shù)字)
number過濾器可以為一個(gè)數(shù)字加上千位分割,像這樣,123,456,789。同時(shí)接收一個(gè)參數(shù),可以指定小float型保留幾位小數(shù):
{{ num | number : 2 }}
currency (貨幣處理)
{{num | currency : '¥'}}
json(格式化json對象)
{{ jsonTest | json}}
作用就和我們熟悉的JSON.stringify()一樣
limitTo(限制數(shù)組長度或字符串長度)
{{ childrenArray | limitTo : 3 }} //將會顯示數(shù)組中的前3項(xiàng)
filter(匹配子串)
用來處理一個(gè)數(shù)組,然后可以過濾出含有某個(gè)子串的元素,作為一個(gè)子數(shù)組來返回??梢允亲址?dāng)?shù)組,也可以是對象數(shù)組。如果是對象數(shù)組,可以匹配屬性的值。它接收一個(gè)參數(shù),用來定義子串的匹配規(guī)則。
html
<ul> <li>filter 匹配子串(以下寫法只是方便觀察)</li> <li>{{ webArr | filter : 'n' }} <!--匹配屬性值中含有n的--></li> <li>{{ webArr | filter : 25 }} <!--匹配屬性值中含有25的--></li> <li>{{ webArr | filter : {name : 'l'} }} <!--//參數(shù)是對象,匹配name屬性中含有l(wèi)的--></li> <li>{{ webArr | filter : fun }} <!--/參數(shù)是函數(shù),指定返回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}]
日期類
日期過濾器應(yīng)該是常用過濾器中最簡單的吧!
- yyyy--表示年份;
- MM--月份(必須大寫);
- dd--日期;
- hh--時(shí);
- mm--分(必須小寫);
- ss--秒;
- EEEE--星期;
- hh:mm--形式是24小時(shí)制;
- h:mma--12小時(shí)制;
- 其中年、月、日、時(shí)、分、秒 或 / : - 等自己試做搭配吧!
<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時(shí)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時(shí)42分09秒
日期4的顯示效果:
2016/11/22 11:16:58
orderBy排序(個(gè)人認(rèn)為第七例最佳寫法)
ng-repeat生成一個(gè)獨(dú)立的scope作用域,直接在ng-repeat循環(huán)后加管道orderBy排序。
用法很簡單,但有坑需注意兩點(diǎn):
- 參數(shù)引號勿忘;
- 參數(shù)形式--直接寫成age,不用寫成item2.age。
3 按年齡排序(默認(rèn)升序)
<ul> <li>3 按年齡排序(默認(rèn)升序)</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>
效果展示:
按年齡排序(默認(rèn)升序) 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 按年齡排序(加參數(shù)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>
效果展示:
按年齡排序(加參數(shù)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 想先按年齡升序在按身高降序(全是降序了,達(dá)不到效果,見第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>
效果展示:
想先按年齡升序在按身高降序(全是降序了,達(dá)不到效果,見第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 先按年齡在按身高排序(多個(gè)參數(shù)寫出數(shù)組形式)
<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>
效果展示:
先按年齡在按身高排序(多個(gè)參數(shù)寫出數(shù)組形式) 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 先按年齡升序在按身高降序(多個(gè)參數(shù)寫出數(shù)組形式)
在參數(shù)前加負(fù)號即可實(shí)現(xiàn)倒序
<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 先按年齡升序在按身高降序(多個(gè)參數(shù)寫出數(shù)組形式) name nick age 25 stature 170 name xzl age 27 stature 175 name ljy age 27 stature 165 name zyh age 29 stature 165
個(gè)人覺得ng內(nèi)置的過濾器好多都比較雞肋。個(gè)性化的需求自定義的過濾器吧。
自定義過濾器
自定義過濾器就是返回一個(gè)函數(shù),函數(shù)又返回你要的值即可!
實(shí)例:
angular.module('youAppName',[]) .filter('youFilterName',function(){ return function(){ //你的處理代碼 return result;//返回你要的值 } })
自定義一個(gè)求和的過濾器
html
<ul> <li>!!1 求和</li> <li ng-repeat="item1 in items1"> <div ng-bind="item1.male | sumNick:item1.female:item1.gay"></div> </li> </ul>
用法:
管道前后所有參數(shù)即為和
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--函數(shù)接受的參數(shù)集合,類數(shù)組;
Array.prototype.slice.call(arguments)
這句將類數(shù)組轉(zhuǎn)為數(shù)組;
sum+=arr[i]?arr[i]:0;
總和sum等于數(shù)組的每個(gè)元素累加的和。避免后臺為傳值,而又將次參數(shù)傳人自定義filer函數(shù)作為參數(shù),容錯時(shí)寫成0保險(xiǎn)。
自定義一個(gè)求百分百的過濾器(求保留小數(shù)點(diǎn)后兩位百分比)
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>
用法:
分子寫在管道前面,管道后面的所有參數(shù)和加管道前的參數(shù)和則為分母
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內(nèi)置函數(shù),Math.round四舍五入保留整數(shù);
將總和乘以10000除以100拼接百分比號,即保留兩位小數(shù)。
完整代碼:
<!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 按年齡排序(默認(rèn)升序)</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 按年齡排序(加參數(shù)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 想先按年齡升序在按身高降序(全是降序了,達(dá)不到效果,見第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 先按年齡在按身高排序(多個(gè)參數(shù)寫出數(shù)組形式)</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 先按年齡升序在按身高降序(多個(gè)參數(shù)寫出數(shù)組形式)</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時(shí)mm分ss秒'"></li> <li>2016年11月22日 10時(shí)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'} }} <!--//參數(shù)是對象,匹配name屬性中含有l(wèi)的--></li> <li>{{ webArr | filter : fun }} <!--/參數(shù)是函數(shù),指定返回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(){//管道前后所有參數(shù)和 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(){//小數(shù)點(diǎn)后兩位百分比 分子寫在管道前面,管道后面的所有參數(shù)和加管道前的參數(shù)和為分母 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>
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
- Angularjs過濾器實(shí)現(xiàn)動態(tài)搜索與排序功能示例
- Angularjs使用過濾器完成排序功能
- AngularJS常見過濾器用法實(shí)例總結(jié)
- AngularJs 常用的過濾器
- 詳解AngularJS中$filter過濾器使用(自定義過濾器)
- AngularJS過濾器filter用法總結(jié)
- Angular實(shí)現(xiàn)的自定義模糊查詢、排序及三角箭頭標(biāo)注功能示例
- AngularJS模糊查詢功能實(shí)現(xiàn)代碼(過濾內(nèi)容下拉菜單排序過濾敏感字符驗(yàn)證判斷后添加表格信息)
- AngularJS 過濾與排序詳解及實(shí)例代碼
- AngularJS ng-table插件設(shè)置排序
- Angular實(shí)現(xiàn)的內(nèi)置過濾器orderBy排序與模糊查詢功能示例
相關(guān)文章
AngularJS 打開新的標(biāo)簽頁實(shí)現(xiàn)代碼
本文通過實(shí)例代碼給大家介紹了angularJS 打開新的標(biāo)簽頁方法,代碼簡單易懂,非常不錯,具有參考借鑒價(jià)值,需要的朋友參考下吧2017-09-09整理AngularJS框架使用過程當(dāng)中的一些性能優(yōu)化要點(diǎn)
這篇文章主要介紹了AngularJS框架使用過程當(dāng)中的一些性能優(yōu)化要點(diǎn),Angular通常被用來制作大型單頁應(yīng)用,因而性能問題也是必須考慮的因素,需要的朋友可以參考下2016-03-03Angular 2父子組件數(shù)據(jù)傳遞之@Input和@Output詳解(下)
這篇文章主要給大家介紹了關(guān)于Angular 2父子組件數(shù)據(jù)傳遞之@Input和@Output的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-07-07