一. 过滤器基础

过滤器用于在视图中格式化展现给用户的数据. 一旦定义过滤器之后, 就可在整个模块中全面应用, 也就意味着可以用来保证跨多个控制器和视图之间的数据展示的一致性.

过滤器将数据在被指令处理并显示到视图中之前进行转换, 而不必修改作用域中原有的数据, 这样能够允许同一份数据在应用中的不同部分以不同的形式得以展现.

过滤器可以执行任意类型的转换, 但是大多数情况下, 用于格式化或者对数据以某种方式排序.

二. 内置过滤器

1. 过滤单个数据的值

名称 描述
currency 该过滤器对货币值进行格式化
date 对日期进行格式化
json 从 JSON 字符串中生成一个对象
number 对数字值进行格式化
uppercase/lowercase 将字符串格式化为全大写或全小写
// currency
<td class="text-right">{{p.price | currency:"£" }}</td>
<td class="text-right">{{p.price | currency}}</td>

// number, number:0 , 0 表示显示的小数位数.
<td class="text-right">${{p.price | number:0 }}</td> 

// date , 格式化日期, 这个日期可以是字符串,JavaScript 日期对象或毫秒数等
 <td>{{getExpiryDate(p.expiry) | date:"dd MMM yy"}}</td>

// uppercase/lowercase
<td>{{p.name | uppercase }}</td>
<td>{{p.category | lowercase }}</td>

date 过滤器支持的格式化字符串

date 过滤器支持的快捷格式化字符串

2. 过滤数据集合

过滤器名称 描述
limitTo 限制项目数量, 支持数组对象,也支持字符串
filter 从数组中华选出一些对象, 选取条件可以为一个表达式,或者一个用于匹配属性的 map 对象
orderBy 对数组中的对象进行排序
// limitTo , 支持正数和负数
<tr ng-repeat="p in products | limitTo:limitVal">

// filter: {FIELD: NAME}, 只显示某个字段的数据. 如果通过一个函数过滤, 那么选出的项目,僵尸那些是的函数执行结果返回 true 的.
<tr ng-repeat="p in products | filter:{category: 'Fish'}">

// 函数式筛选
$scope.selectItems = function (item) {
    return item.category == "Fish" || item.name == "Beer";

<tr ng-repeat="p in products | filter:selectItems">

// orderBy:
<tr ng-repeat="p in products | orderBy:'price'"> // 根据对象的 price 属性进行排序. 注意引号
<tr ng-repeat="p in products | orderBy:'price'"> // price 降序

// 使用排序函数
$scope.myCustomSorter = function (item) {
    return item.expiry < 5 ? 0 : item.price;
}
<tr ng-repeat="p in products | orderBy:myCustomSorter">

// 排序数组, 多次排序
<tr ng-repeat="p in products | orderBy:[myCustomSorter, '-price']">

3. 链式过滤

使用多个过滤器, 按照顺序对同一数据进行操作.

<tr ng-repeat="p in products | orderBy:[myCustomSorter, '-price'] | limitTo: 5">

三. 自定义过滤器

Module.filter方法用于定义过滤器, 其参数是新过滤器的名称以及一个在调用时将会创建过滤器的工厂函数. 过滤器本身就是函数, 接受数据值并进行格式化, 这样就可以显示该值了.

示例 : 用于过滤单个数据值的过滤器

// labelCase 用于将字符串格式化为 只有首字母大写.
angular.module("exampleApp")    // 此处用于查找 exampleApp 模块, 在这一段代码被当引用的时候, 应当放在 exampleApp 定义代码的后面.
    .filter("labelCase", function () {
        return function (value, reverse) {      // value 参数是待被过滤的值, 在应用时由 AngularJS 提供; reverse 参数用于允许过滤器用途被颠倒过来.
            if (angular.isString(value)) {
                var intermediate =  reverse ? value.toUpperCase() : value.toLowerCase();
                return (reverse ? intermediate[0].toLowerCase() :
                    intermediate[0].toUpperCase()) + intermediate.substr(1);
            } else {
                return value;
            }
        };
    });

// 在 HTML 代码中使用
<td>{{p.name | labelCase }}</td>    // 此处没有指定第二个参数, 则 AngularJS 会将 null 值传给过滤器的worker 函数的第二个参数.
<td>{{p.category | labelCase:true }}</td>    

示例 : 用于过滤数据集合的过滤器

// skip 用于返回数据集合中指定数量的元素.
angular.module("exampleApp")
    .filter("labelCase", function () {
        return function (value, reverse) {
            if (angular.isString(value)) {
                var intermediate =  reverse ? value.toUpperCase() : value.toLowerCase();
                return (reverse ? intermediate[0].toLowerCase() :
                    intermediate[0].toUpperCase()) + intermediate.substr(1);
            } else {
                return value;
            }
        };
    })
    .filter("skip", function () {
        return function (data, count) {
            if (angular.isArray(data) && angular.isNumber(count)) {     // 边界检查
                if (count > data.length || count < 1) {     // 边界检查
                    return data;
                } else {
                    return data.slice(count);
                }
            } else {
                return data;
            }
        }
    });

// 调用
<tr ng-repeat="p in products | skip:2 | limitTo: 5">

示例 : 在已有的过滤器上搭建新的过滤器.

// 将 skip 和 limitTo 的功能合并到单个过滤器中.
angular.module("exampleApp")
    .filter("labelCase", function () {
        return function (value, reverse) {
            if (angular.isString(value)) {
                var intermediate =  reverse ? value.toUpperCase() : value.toLowerCase();
                return (reverse ? intermediate[0].toLowerCase() :
                    intermediate[0].toUpperCase()) + intermediate.substr(1);
            } else {
                return value;
            }
        };
    })
    .filter("skip", function () {
        return function (data, count) {
            if (angular.isArray(data) && angular.isNumber(count)) {
                if (count > data.length || count < 1) {
                    return data;
                } else {
                    return data.slice(count);
                }
            } else {
                return data;
            }
        }
    .filter("take", function ($filter) {    // 声明对 $filter 服务的依赖, 这提供了对模块中所有已定义的过滤器的访问能力. 这些过滤器通过在 worker 函数中通过名称来访问和调用.
        return function (data, skipCount, takeCount) {
            var skippedData = $filter("skip")(data, skipCount);
            return $filter("limitTo")(skippedData, takeCount);
        }
    });

    // html 中调用
    <tr ng-repeat="p in products | take:2:5">   // 多个参数.

AngularJS高级程序设计读书笔记 -- 过滤器篇的更多相关文章

  1. AngularJS高级程序设计读书笔记 -- 大纲篇

    零. 初衷 现在 AngularJS 4 已经发布了, 楼主还停留在 1.x 的阶段, 深感自卑. 学习 AngularJS 的初衷是因为, 去年楼主开始尝试使用 Flask 开发自动化程序, 需要用 ...

  2. AngularJS高级程序设计读书笔记 -- 模块篇

    一. 模块基础 1. 创建模块 <!DOCTYPE html> <html ng-app="exampleApp"> <head> <ti ...

  3. AngularJS高级程序设计读书笔记 -- 服务篇

    服务是提供在整个应用程序中所使用的任何功能的单例对象. 单例 : 只用一个对象实例会被 AngularJS 创建出来, 并被程序需要服务的各个不同部分所共享. 1. 内置服务 一些关键方法也被 Ang ...

  4. AngularJS高级程序设计读书笔记 -- 指令篇 之 自定义指令

    2. 自定义指令(15-17 章) Module.directive(name, factory) 2.1 创建自定义指令的方法 Module.directive(name, factory) 示例 ...

  5. AngularJS高级程序设计读书笔记 -- 指令篇 之 内置指令

    1. 内置指令(10-12 章) AngularJS 内置超过 50 个内置指令, 包括 数据绑定,表单验证,模板生成,时间处理 和 HTML 操作. 指令暴露了 AngularJS 的核心功能, 如 ...

  6. AngularJS高级程序设计读书笔记 -- 控制器篇

    作用域组成了一个能够用于在控制器之间形成通信的体系结构. 1. 控制器和作用域的基本原理 控制器就像领域模型与视图之间的纽带, 他给视图提供数据与服务, 并且定义了所需的业务逻辑, 从而将用户行为转换 ...

  7. javascript高级程序设计读书笔记-事件(一)

    读书笔记,写的很乱   事件处理程序   事件处理程序分为三种: 1.html事件2. DOM0级,3,DOM2级别  没有DOM1 同样的事件 DOM0会顶掉html事件   因为他们都是属性  而 ...

  8. javascript高级程序设计读书笔记

    第2章  在html中使用javascript 一般都会把js引用文件放在</body>前面,而不是放在<head>里, 目的是最后读取js文件以提高网页载入速度. 引用js文 ...

  9. Javascript高级程序设计读书笔记(第六章)

    第6章  面向对象的程序设计 6.2 创建对象 创建某个类的实例,必须使用new操作符调用构造函数会经历以下四个步骤: 创建一个新对象: 将构造函数的作用域赋给新对象: 执行构造函数中的代码: 返回新 ...

随机推荐

  1. Set up HTTP/2 server with Spring Boot 【基于Spring boot搭建http2.0服务器】

    1. Server side With spring boot, we can set up a http server easily. Restcontroller make it easier t ...

  2. 使用java API操作HDFS-相关环境的设置

    用于装在编译类,即为hadoop的类路径 退出后重新登录,再使用env检查. jps可以直接使用了,表示已经设置成功. 在myclass之中创建类文件,这个myclass目录是自己创建的.

  3. 关于使用JavaScript实现图片点击切换(附带改变导航图片 方案二)

    具体需求见方案一. 这种方案相比方案一更加专业. <!DOCTYPE html> <html> <head lang="en"> <met ...

  4. VueJs开发笔记—IDE选择和WebStorm性能优化、框架特性和数据调用、路由选项以及使用

    一.IDE的选择: VsCode和WebStorm都是不错的选择,两者运行调试都非常的方便都可以使用快捷键运行和停止,就打开项目的速度和对电脑配置的要求来说,vscode要比webstorm要出色很多 ...

  5. iOS之copy、strong使用,block特性

    身边一同事,我印象在过去三个月,有两次因为使用“copy”修饰UIKit控件的属性,导致程序崩溃.他还一本正经的说我以前一直使用copy. 好了,到这里我们就不得不说说什么时候使用copy.我的印象中 ...

  6. 电商的噩梦?实体商家的福音——VR全景智慧城市

    我们不知道未来网络购物的样子,但对当前电商平台的问题是清楚的.从消费者角度来看,网购的顾虑主要在于商品的质量难以保证.物流效率不够高,以及网络购物的"眼见不为实". 正因为可以很好 ...

  7. VR全景智慧城市——“海市蜃楼”般的逛街体验

    <史记·天官书>:"海旁蜃气像楼台:广野气成宫阙然." 海市蜃楼,简称蜃景,是一种因为光的折射和全反射而形成的自然现象,是地球上物体反射的光经大气折射而形成的虚像. 2 ...

  8. 最近一些朋友问我,临近快毕业了专业不对口,想转行看到IT行业就业前景不错,但是编程语言众多不了解,不知道哪门语言能够快速入门掌握,短期能让我找到工作

    我做互联网前端后台开发也有四年多了,一路走过来,累并快乐着.快乐比艰辛更多,源自我的兴趣驱动.初中的一个偶然的机会我接触到了计算机,从那个时候就喜欢上开始经常到网吧上网.那个时候我对计算机领域的认识是 ...

  9. Scala基础 - 下划线使用指南

    下划线这个符号几乎贯穿了任何一本Scala编程书籍,并且在不同的场景下具有不同的含义,绕晕了不少初学者.正因如此,下划线这个特殊符号无形中增加Scala的入门难度.本文希望帮助初学者踏平这个小山坡. ...

  10. 文本主题模型之LDA(一) LDA基础

    文本主题模型之LDA(一) LDA基础 文本主题模型之LDA(二) LDA求解之Gibbs采样算法 文本主题模型之LDA(三) LDA求解之变分推断EM算法(TODO) 在前面我们讲到了基于矩阵分解的 ...