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){returne.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> <ling-bind="date|date:'yyyy/MM/ddhh:mm:ssEEEE'"></li> <li>8日期2</li> <ling-bind="date|date:'yyyy年MM月dd日h:mmaEEEE'"></li> <li>8日期3</li> <ling-bind="date|date:'yyyy年MM月dd日hh时mm分ss秒'"></li> <li>8日期4</li> <ling-bind="date|date:'yyyy/MM/ddhh:mm:ss'"></li> </ul>
日期1的显示效果:
2016/11/1911:59:05Saturday
日期2的显示效果:
2016年11月19日12:01PMSaturday
日期3的显示效果:
2016年11月22日10时42分09秒
日期4的显示效果:
2016/11/2211:16:58
orderBy排序(个人认为第七例最佳写法)
ng-repeat生成一个独立的scope作用域,直接在ng-repeat循环后加管道orderBy排序。
用法很简单,但有坑需注意两点:
参数引号勿忘;
参数形式--直接写成age,不用写成item2.age。
3按年龄排序(默认升序)
<ul> <li>3按年龄排序(默认升序)</li> <ling-repeat="item2initems2|orderBy:'age'"> <div> <b>name</b> <ung-bind="item2.name"></u> </div> <div> <b>age</b> <ing-bind="item2.age"></i> </div> <div> <b>stature</b> <ing-bind="item2.stature"></i> </div> </li> </ul>
效果展示:
3按年龄排序(默认升序)
nameljy age27 stature165 namenick age25 stature170 namexzl age27 stature175 namezyh age29 stature165
4按年龄排序(加参数true则为倒序即降序)
<ul> <ling-repeat="item2initems2|orderBy:'age':true"> <div> <b>name</b> <ung-bind="item2.name"></u> </div> <div> <b>age</b> <ing-bind="item2.age"></i> </div> <div> <b>stature</b> <ing-bind="item2.stature"></i> </div> </li> </ul>
效果展示:
4按年龄排序(加参数true则为倒序即降序)
namezyh age29 stature165 namexzl age27 stature175 nameljy age27 stature165 namenick age25 stature170
5想先按年龄升序在按身高降序(全是降序了,达不到效果,见第7例)
我曾就天真的这样写过^*^
<ul> <!--<ling-repeat="item2initems2|orderBy:'age':'-stature'">--> <ling-repeat="item2initems2|orderBy:'age':'stature':true"> <div> <b>name</b> <ung-bind="item2.name"></u> </div> <div> <b>age</b> <ing-bind="item2.age"></i> </div> <div> <b>stature</b> <ing-bind="item2.stature"></i> </div> </li> </ul>
效果展示:
5想先按年龄升序在按身高降序(全是降序了,达不到效果,见第7例)
namezyh age29 stature165 namexzl age27 stature175 nameljy age27 stature165 namenick age25 stature170
6先按年龄在按身高排序(多个参数写出数组形式)
<ul> <ling-repeat="item2initems2|orderBy:['age','stature']"> <div> <b>name</b> <ung-bind="item2.name"></u> </div> <div> <b>age</b> <ing-bind="item2.age"></i> </div> <div> <b>stature</b> <ing-bind="item2.stature"></i> </div> </li> </ul>
效果展示:
6先按年龄在按身高排序(多个参数写出数组形式)
namenick age25 stature170 nameljy age27 stature165 namexzl age27 stature175 namezyh age29 stature165
7先按年龄升序在按身高降序(多个参数写出数组形式)
在参数前加负号即可实现倒序
<ul> <ling-repeat="item2initems2|orderBy:['age','-stature']"> <div> <b>name</b> <ung-bind="item2.name"></u> </div> <div> <b>age</b> <ing-bind="item2.age"></i> </div> <div> <b>stature</b> <ing-bind="item2.stature"></i> </div> </li> </ul>
效果展示:
!!7先按年龄升序在按身高降序(多个参数写出数组形式)
namenick age25 stature170 namexzl age27 stature175 nameljy age27 stature165 namezyh age29 stature165
个人觉得ng内置的过滤器好多都比较鸡肋。个性化的需求自定义的过滤器吧。
自定义过滤器
自定义过滤器就是返回一个函数,函数又返回你要的值即可!
实例:
angular.module('youAppName',[])
.filter('youFilterName',function(){
returnfunction(){
//你的处理代码
returnresult;//返回你要的值
}
})
自定义一个求和的过滤器
html
<ul> <li>!!1求和</li> <ling-repeat="item1initems1"> <divng-bind="item1.male|sumNick:item1.female:item1.gay"></div> </li> </ul>
用法:
管道前后所有参数即为和
js
varnickAppModule=angular.module('nickApp',[]);
nickAppModule
//求和
.filter('sumNick',function(){
returnfunction(){
vararr=Array.prototype.slice.call(arguments),sum=0;
for(vari=0,len=arr.length;i<len;i++){
sum+=arr[i]?arr[i]:0;
}
returnsum;
}
})
arguments--函数接受的参数集合,类数组;
Array.prototype.slice.call(arguments)
这句将类数组转为数组;
sum+=arr[i]?arr[i]:0;
总和sum等于数组的每个元素累加的和。避免后台为传值,而又将次参数传人自定义filer函数作为参数,容错时写成0保险。
自定义一个求百分百的过滤器(求保留小数点后两位百分比)
html
<ulng-repeat="item1initems1"> <li>!!2求百分比</li> <li> <b>male</b> <ing-bind="item1.male|percentNick:item1.female:item1.gay"></i> </li> <li> <b>female</b> <ung-bind="item1.female|percentNick:item1.male:item1.gay"></u> </li> <li> <b>gay</b> <sng-bind="item1.gay|percentNick:item1.female:item1.male"></s> </li> </ul>
用法:
分子写在管道前面,管道后面的所有参数和加管道前的参数和则为分母
js
varnickAppModule=angular.module('nickApp',[]);
nickAppModule
//百分比
.filter('percentNick',function(){
returnfunction(){
vararr=Array.prototype.slice.call(arguments),sum=0;
for(vari=0,len=arr.length;i<len;i++){
sum+=arr[i]?arr[i]:0;
}
//0/0也是nan
returnsum==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拼接百分比号,即保留两位小数。
完整代码:
<!DOCTYPEhtml>
<htmllang="zh-CN"ng-app="nickApp">
<head>
<metacharset="UTF-8">
<title>ngfilternick</title>
</head>
<bodyng-controller="nickCtrl">
<ul>
<li>!!1求和</li>
<ling-repeat="item1initems1">
<divng-bind="item1.male|sumNick:item1.female:item1.gay"></div>
</li>
</ul>
<ulng-repeat="item1initems1">
<li>!!2求百分比</li>
<li>
<b>male</b>
<ing-bind="item1.male|percentNick:item1.female:item1.gay"></i>
</li>
<li>
<b>female</b>
<ung-bind="item1.female|percentNick:item1.male:item1.gay"></u>
</li>
<li>
<b>gay</b>
<sng-bind="item1.gay|percentNick:item1.female:item1.male"></s>
</li>
</ul>
<ul>
<li>3按年龄排序(默认升序)</li>
<ling-repeat="item2initems2|orderBy:'age'">
<div>
<b>name</b>
<ung-bind="item2.name"></u>
</div>
<div>
<b>age</b>
<ing-bind="item2.age"></i>
</div>
<div>
<b>stature</b>
<ing-bind="item2.stature"></i>
</div>
</li>
</ul>
<ul>
<li>4按年龄排序(加参数true则为倒序即降序)</li>
<ling-repeat="item2initems2|orderBy:'age':true">
<div>
<b>name</b>
<ung-bind="item2.name"></u>
</div>
<div>
<b>age</b>
<ing-bind="item2.age"></i>
</div>
<div>
<b>stature</b>
<ing-bind="item2.stature"></i>
</div>
</li>
</ul>
<ul>
<li>5想先按年龄升序在按身高降序(全是降序了,达不到效果,见第7例)</li>
<!--<ling-repeat="item2initems2|orderBy:'age':'-stature'">-->
<ling-repeat="item2initems2|orderBy:'age':'stature':true">
<div>
<b>name</b>
<ung-bind="item2.name"></u>
</div>
<div>
<b>age</b>
<ing-bind="item2.age"></i>
</div>
<div>
<b>stature</b>
<ing-bind="item2.stature"></i>
</div>
</li>
</ul>
<ul>
<li>6先按年龄在按身高排序(多个参数写出数组形式)</li>
<ling-repeat="item2initems2|orderBy:['age','stature']">
<div>
<b>name</b>
<ung-bind="item2.name"></u>
</div>
<div>
<b>age</b>
<ing-bind="item2.age"></i>
</div>
<div>
<b>stature</b>
<ing-bind="item2.stature"></i>
</div>
</li>
</ul>
<ul>
<li>!!7先按年龄升序在按身高降序(多个参数写出数组形式)</li>
<ling-repeat="item2initems2|orderBy:['age','-stature']">
<div>
<b>name</b>
<ung-bind="item2.name"></u>
</div>
<div>
<b>age</b>
<ing-bind="item2.age"></i>
</div>
<div>
<b>stature</b>
<ing-bind="item2.stature"></i>
</div>
</li>
</ul>
<ul>
<li>8日期1</li>
<ling-bind="date|date:'yyyy/MM/ddhh:mm:ssEEEE'"></li>
<li>2016/11/1911:59:05Saturday</li>
<li>8日期2</li>
<ling-bind="date|date:'yyyy年MM月dd日h:mmaEEEE'"></li>
<li>2016年11月19日12:01PMSaturday</li>
<li>8日期3</li>
<ling-bind="date|date:'yyyy年MM月dd日hh时mm分ss秒'"></li>
<li>2016年11月22日10时42分09秒</li>
<li>8日期4</li>
<ling-bind="date|date:'yyyy/MM/ddhh:mm:ss'"></li>
<li>2016/11/2211: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>
<scriptsrc="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
<script>
varnickAppModule=angular.module('nickApp',[]);
nickAppModule
//求和
.filter('sumNick',function(){//管道前后所有参数和
returnfunction(){
vararr=Array.prototype.slice.call(arguments),sum=0;
for(vari=0,len=arr.length;i<len;i++){
sum+=arr[i]?arr[i]:0;
}
returnsum;
}
})
//百分比
.filter('percentNick',function(){//小数点后两位百分比分子写在管道前面,管道后面的所有参数和加管道前的参数和为分母
returnfunction(){
vararr=Array.prototype.slice.call(arguments),sum=0;
for(vari=0,len=arr.length;i<len;i++){
sum+=arr[i]?arr[i]:0;
}
//0/0也是nan
returnsum==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=newDate();
$scope.webArr=[
{name:'nick',age:25},
{name:'ljy',age:28},
{name:'xzl',age:28},
{name:'zyh',age:30}
];
$scope.fun=function(e){returne.age>25;};
}])
</script>
</body>
</html>
以上所述是小编给大家介绍的Angularjs之filter过滤器,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对毛票票网站的支持!