Angularjs之filter过滤器(推荐)


Posted in Javascript onNovember 27, 2016

现在公司用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>

以上所述是小编给大家介绍的Angularjs之filter过滤器,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript客户端解决方案 缓存提供程序
Jul 14 Javascript
关于IE中getElementsByClassName不能用的问题解决方法
Aug 26 Javascript
父页面显示遮罩层弹出半透明状态的dialog
Mar 04 Javascript
JS原型、原型链深入理解
Feb 27 Javascript
基于javascript html5实现3D翻书特效
Mar 14 Javascript
jQuery 如何给Carousel插件添加新的功能
Apr 18 Javascript
ES6所改良的javascript“缺陷”问题
Aug 23 Javascript
Angular.js跨controller实现参数传递的两种方法
Feb 20 Javascript
Angular4 中内置指令的基本用法
Jul 31 Javascript
javascript帧动画(实例讲解)
Sep 02 Javascript
微信小程序onLaunch异步,首页onLoad先执行?
Sep 20 Javascript
jquery+css实现Tab栏切换的代码实例
May 14 jQuery
Web前端开发之水印、图片验证码
Nov 27 #Javascript
jQuery时间日期三级联动(推荐)
Nov 27 #Javascript
Jquery 整理元素选取、常用方法一览表
Nov 26 #Javascript
jQuery插件扩展实例【添加回调函数】
Nov 26 #Javascript
JS扩展类,克隆对象与混合类实例分析
Nov 26 #Javascript
JS自定义混合Mixin函数示例
Nov 26 #Javascript
JS克隆,属性,数组,对象,函数实例分析
Nov 26 #Javascript
You might like
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
也谈截取首页新闻 - 范例
2006/10/09 PHP
PHP导入Excel到MySQL的方法
2011/04/23 PHP
PHP 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
PHP设计模式之组合模式定义与应用示例
2020/02/01 PHP
一个js实现的所谓的滑动门
2007/05/23 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
Vue 组件参数校验与非props特性的方法
2019/02/12 Javascript
在vue中使用G2图表的示例代码
2019/03/19 Javascript
详解vue-cli中使用rem,vue自适应
2019/05/06 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
Python检测网站链接是否已存在
2016/04/07 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
python数据处理 根据颜色对图片进行分类的方法
2018/12/08 Python
使用python进行拆分大文件的方法
2018/12/10 Python
django 中QuerySet特性功能详解
2019/07/25 Python
CSS 3.0 结合video视频实现的创意开幕效果
2020/06/01 HTML / CSS
男女时尚与复古风格在线购物:RoseGal(全球免费送货)
2017/07/19 全球购物
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
以太网Ethernet IEEE802.3
2013/08/05 面试题
大学毕业生简单自荐信
2013/11/05 职场文书
竞选班长演讲稿
2013/12/30 职场文书
母亲节感恩活动记录
2014/03/16 职场文书
土建专业毕业生自荐书
2014/07/04 职场文书
2015年财务部工作总结
2015/04/10 职场文书
电影小兵张嘎观后感
2015/06/03 职场文书
解决Golang中ResponseWriter的一个坑
2021/04/27 Golang
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL