过滤器 filter

过滤器是AngularJS的另一项强大的功能,如果能使用好它,能够帮助我们极大的节省工作量。

以下是几个应用filter的例子:

  1. {{ 1234 | number:2 }}
  2. //显示两位小数,结果 1,234.00
  3. {{ 1234.56 | currency:"人民币¥":0}}
  4. //转化为货币后输出(保留0位小数,四舍五入),结果为
  5. //人民币¥1,234.00
  6. {{ list | json }}
  7. //将对象转化为json文本输出,结果为
  8. //[ { "name": "Harry" }, { "name": "Tom" }, { "name": "Jerry" } ]
  9. <tr ng-repeat="x in list | orderBy:'name'">
  10. //对显示的数据列表按照name进行排序
  11. //结果为显示顺序Harry,Jerry,Tom

以上都是AngularJS的常用用法,具体的系统自带的filter的列表,我们可以从官方网站上获取。这里对管网提供的功能进行一个简要列表:

Filter名称 示例用法 说明
filter - 传入自定义的函数作为过滤器
currency currency / currency:”人民币¥”:0 转化为货币后输出。可选货币单位和保留小数位数。
number number / number:2 将数字转化为文本,自动加逗号。可选设置小数位数。
date data : format : timezone 将时间转化到对应的格式和时区
json json 将对象转化为Json格式内容输出
lowercase lowercase 将文本转化为小写
uppercase uppercase 将文本转化为大写
limitTo limitTo : limit : begin 截取array从begin位置开始的limit个元素
orderBy orderBy : expression : reverse 根据expression的条件对list进行排序,reverse可选,设置为true则反过来排

多个filter同时应用

AngularJS支持多个filter同时应用,比如以下的例子:

  1. {{ list | orderBy:'name' | json }}
  2. //对list的内容进行排序后输出成json文本,结果为
  3. //[ { "name": "Harry" }, { "name": "Jerry" }, { "name": "Tom" } ]

创建自己的过滤器

自己创建自定义的过滤器也很简单,我们下面尝试自己制作一个将文字全部翻转过来的过滤器。

app.js中增加如下代码:

  1. //app.js
  2. App.filter("reverse", function(){
  3. return function(text){
  4. return text.split("").reverse().join("");
  5. }
  6. });

同时,我们利用最早的Hello World的例子,将我们定义的reverse这个过滤器应用上去,代码如下:

  1. <div ng-controller="FirstCtrl">
  2. <h1>{{data.message | reverse}}</h1>
  3. <input type="text" ng-model="data.message">
  4. </div>

运行效果:

图4-10 自定义filter的运行效果

如果您期望界面显示的内容进行一些通用的处理,但是又不希望对原本的数据进行改动,那么可以考虑自己制作过滤器!

通过filter进行搜索

AngularJS提供了通过filter的搜索功能。当然,这个搜索功能并不是非常常用,因为搜索工作现在一般在服务端完成。如果数据量非常小(几百行以内),可以考虑使用本功能来筛选结果。

示例如下(使用上一节的例子):

  1. App.controller("FirstCtrl", function ($scope) {
  2. $scope.searchText = '';
  3. $scope.list = [
  4. {
  5. name: "Harry"
  6. },
  7. {
  8. name: "Tom"
  9. },
  10. {
  11. name: "Jerry"
  12. }
  13. ];
  14. });
  1. <div ng-controller="FirstCtrl">
  2. <input type="text" ng-model="searchText">
  3. <table>
  4. <tr ng-repeat="x in list | filter:searchText">
  5. <td>{{x.name}}</td>
  6. </tr>
  7. </table>
  8. </div>

如果我们在输入框中输入T,则列表中只会显示包含T的项目。

图4-10-1 filter用于搜索

一些值得注意的用法

用法 效果
searchText = "T" 搜索所有字段
searchText = {name:"T"} 只搜索name字段包含T的项目
searchText = {name:"T", last:"H"} 搜索name字段包含Tlast字段包含H的项目

对于最后一项,我们可以采取如下输入方法来应用:

  1. <div ng-controller="FirstCtrl">
  2. <input type="text" ng-model="searchText.name">
  3. <input type="text" ng-model="searchText.last">
  4. <table>
  5. <tr ng-repeat="x in list | filter:searchText">
  6. <td>{{x.name}}</td>
  7. <td>{{x.last}}</td>
  8. </tr>
  9. </table>
  10. </div>