实例解析angularjs的filter过滤器_AngularJS

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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索filter
angularjs
c filter 过滤器 实例、angularjs filter、angularjs 过滤器、angularjs 时间过滤器、angularjs 日期过滤器,以便于您获取更多的相关知识。

时间: 2024-11-06 09:43:09

实例解析angularjs的filter过滤器_AngularJS的相关文章

详解Angularjs filter过滤器_AngularJS

系统的学习了一下angularjs,发现angularjs的有些思想根php的模块smarty很像,例如数据绑定,filter.如果对smarty比较熟悉的话,学习angularjs会比较容易一点.这篇简单说一下angularjs的filter功能,angularjs的filter功能可分为二种,一种是内置的过滤器,一种是自定义的. Filter是用来格式化数据用的. Filter的基本原型( '' 类似于Linux中的管道模式): {{ expression filter }} Filter可

详解AngularJS中自定义过滤器_AngularJS

过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果.主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等.ng内置了一些过滤器,它们是:currency(货币).date(日期).filter(子串匹配).json(格式化json对象).limitTo(限制个数).lowercase(小写).uppercase(大写).number(数字).orderBy(排序).总共九种.除此之外还可以自定义过滤器,这个就强大了,可以满足任何

AngularJS中的过滤器filter用法完全解析_AngularJS

在AngularJS的世界里,filter提供了一种格式化数据的方法,Angular也提供给我们了很多内建的过滤器,并且建立自定义过滤器也是相当的简单 在HTML的模板绑定{{}}中,我们使用 | 来调用过滤器,比如,我们想让字符串全部大写字符显示: {{ name | uppercase }} 当然了,我们也可以在JavaScript中使用$filter服务来调用过滤器,还拿字符串大写来举例: app.controller('DemoController', ['$scope', '$filt

AngularJS变量及过滤器Filter用法分析_AngularJS

本文实例讲述了AngularJS变量及过滤器Filter用法.分享给大家供大家参考,具体如下: 1. 关于部分变量的操作 设置变量: ng-init="hour=14" //设置hour变量在DOM中 使用data-ng-init 更好些 $scope.hour = 14; //设置hour变量在js中 使用变量: (1) 如果是在DOM 相关的 ng-*** 属性里 直接写变量名 如: <p ng-show="hour > 13">I am vi

PHP Filter过滤器全面解析_php实例

PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入. 什么是 PHP 过滤器? PHP 过滤器用于验证和过滤来自非安全来源的数据. 验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分. 设计 PHP 的过滤器扩展的目的是使数据过滤更轻松快捷. 为什么使用过滤器? 几乎所有 web 应用程序都依赖外部的输入.这些数据通常来自用户或其他应用程序(比如 web 服务).通过使用过滤器,您能够确保应有程序获得正确的输入类型. 您应该始终对外部数据进行过滤! 输入过滤是最重

详解AngularJS中的filter过滤器用法_AngularJS

系统的学习了一下angularjs,发现angularjs的有些思想根php的模块smarty很像,例如数据绑定,filter.如果对smarty比较熟悉的话,学习angularjs会比较容易一点.这篇简单说一下angularjs的filter功能,angularjs的filter功能可分为二种,一种是内置的过滤器,一种是自定义的. 一,内置的过滤器 1,uppercase,lowercase大小转换 {{ "lower cap string" | uppercase }} //结果:

AngularJs学习第八篇 过滤器filter创建_AngularJS

demo 这是整个示例demo 1.filter.js文件 angular.module("exampleApp", []) .constant("productsUrl", "http://localhost:/products") .controller("defaultCtrl", function ($scope, $http, productsUrl) { $http.get(productsUrl).success

angularJs中的filter过滤器的使用方法

 filter过滤器是angular中一个很实用的工具,通过它我们可以很简单的对我们的数据进行格式化,看例子: 表达式中添加过滤器 过滤器可以通过一个管道字符(|)和一个过滤器添加到表达式中.. ((下面的两个实例,我们将使用前面章节中提到的 person 控制器)) uppercase 过滤器将字符串格式化为大写: AngularJS 实例 <div ng-app="myApp" ng-controller="personCtrl"> <p>

JAVAEE Filter 过滤器设置是否缓存实例详解_java

在网页中,每次的客户端访问服务器,有部分不用重复请求,如有些图片,视频等就没有必要每次都请求,这样会让服务器增大工作量.为了防止这样,我们采用过滤器来设置客户端是都缓存. 页面的缓存与不缓存设置及html页面中meta的作用 HTTP1.1中启用Cache-Control 来控制页面的缓存与否,这里介绍几个常用的参数: no-cache,浏览器和缓存服务器都不应该缓存页面信息: public,浏览器和缓存服务器都可以缓存页面信息: no-store,请求和响应的信息都不应该被存储在对方的磁盘系统