实例解析angularjs的filter过滤器


Posted in Javascript onDecember 14, 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>

效果展示:

按年龄排序(默认升序)
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>

效果展示:

按年龄排序(加参数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>

效果展示:

想先按年龄升序在按身高降序(全是降序了,达不到效果,见第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>

效果展示:

先按年龄在按身高排序(多个参数写出数组形式)
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>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
javascript编程起步(第一课)
Jan 10 Javascript
jQuery调用WebService的实现代码
Jun 19 Javascript
基于javascript 闭包基础分享
Jul 10 Javascript
带左右箭头图片轮播的JS代码
Dec 18 Javascript
js实现飞入星星特效代码
Oct 17 Javascript
javasript实现密码的隐藏与显示
May 08 Javascript
js实现超简单的展开、折叠目录代码
Aug 28 Javascript
javascript深拷贝(deepClone)详解
Aug 24 Javascript
JavaScript ES6中CLASS的使用详解
Nov 22 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
Dec 02 Javascript
深入理解react-router 路由的实现原理
Sep 26 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
Apr 08 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
Dec 14 #Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
Dec 14 #Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Dec 14 #Javascript
javascript中的try catch异常捕获机制用法分析
Dec 14 #Javascript
微信小程序 scroll-view组件实现列表页实例代码
Dec 14 #Javascript
AngularJS指令中的绑定策略实例分析
Dec 14 #Javascript
JavaScript触发onScroll事件的函数节流详解
Dec 14 #Javascript
You might like
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
php多文件打包下载的实例代码
2017/07/12 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
2013/09/05 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
jQueryUI Datepicker组件设置日期高亮
2016/10/13 Javascript
bootstrap suggest搜索建议插件使用详解
2017/03/25 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
Vue父子传递实例讲解
2020/02/14 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
python实现旋转和水平翻转的方法
2018/10/25 Python
python+selenium实现简历自动刷新的示例代码
2019/05/20 Python
PyQt5 QTable插入图片并动态更新的实例
2019/06/18 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
python生成并处理uuid的实现方式
2020/03/03 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
AssertionError 跟一下那个类是 “is – a”的关系
2012/02/21 面试题
运动会广播稿300字
2014/01/10 职场文书
大型晚会策划方案
2014/02/06 职场文书
共产党员公开承诺书范文
2014/03/28 职场文书
幼儿园小班见习报告
2014/10/31 职场文书
2014年班组长工作总结
2014/11/20 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
新员工入职感想
2015/08/07 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书
闭幕词的写作格式与范文!
2019/06/24 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书
python实现简单反弹球游戏
2021/04/12 Python