## 内置的过滤器 | 过滤器 | 说明 | | :----: | :----: | | currency | 格式化数字为货币格式 | | date | 格式化时间 | | filter | 从数组项中选择一个子集 | | number | 将数字格式化为文本 | | json | 将JSON或JavaScript对象转换为字符串 | | limitTo | 根据传入的参数生成一个新的数组或字符串 | | lowercase | 将字符串转换为小写 | | uppercase | 将字符串转换为大写 | | orderBy | 排序 | **(1) currency** `currency`过滤器可以将一个数值格式化为货币格式。 实例(5-1.html): ``` {{ 123 | currency }} // $123.00 ``` 我们还可以自己设置货币符号,默认会采用客户端所处区域的货币符号。 ``` {{ 123 | currency: '¥' }} // ¥123.00 ``` **(2) date** `date`过滤器可以将日期格式化成需要的格式。默认会采用`mediumDate`格式。 实例(5-2.html): 定义一个时间属性: ``` $scope.today = new Date(); ``` 本地化的日期格式: ``` {{ today | date: 'medium' }} // Feb 4, 2017 11:38:01 AM {{ today | date:'short' }} // 2/4/17 11:38 AM {{ today | date:'fullDate' }} // Saturday, February 4, 2017 {{ today | date:'longDate' }} // February 4, 2017 {{ today | date:'mediumDate' }} // Feb 4, 2017 {{ today | date:'shortDate' }} // 2/4/17 {{ today | date:'mediumTime' }} // 11:38:01 AM {{ today | date:'shortTime' }} // 11:38 AM ``` 年份格式化: ``` 四位年份:{{ today | date:'yyyy' }} // 2017 两位年份:{{ today | date:'yy' }} // 17 一位年份:{{ today | date:'y' }} // 2017 ``` 月份格式化: ``` 英文月份:{{ today | date:'MMMM' }} // February 英文缩写:{{ today | date:'MMM' }} // Feb 数字月份:{{ today | date:'MM' }} // 02 一年中的第几个月份:{{ today | date:'M' }} // 2 ``` 日期格式化: ``` 数字日期:{{ today | date:'dd' }} // 04 一个月中的第几天:{{ today | date:'d' }} // 4 英文星期:{{ today | date:'EEEE' }} // Saturday 英文缩写:{{ today | date:'EEE' }} // Sat ``` 小时格式化: ``` 24小时制数字小时:{{ today | date:'HH' }} // 00 一天中的第几个小时:{{ today | date:'H' }} // 0 12小时制数字小时:{{ today | date:'hh' }} // 12 上午或下午的第几个小时:{{ today | date:'h' }} // 12 ``` 分钟格式化: ``` 数字分钟数:{{ today | date:'mm' }} // 40 一个小时中的第几分钟:{{ today | date:'m' }} // 40 ``` 秒数格式化: ``` 数字秒数:{{ today | date:'ss' }} // 41 一分钟内的第几秒:{{ today | date:'s' }} // 41 毫秒数:{{ today | date:'.sss' }} // .440 ``` 字符格式化: ``` 上下午标识:{{ today | date:'a' }} // AM 四位时区标识:{{ today | date:'Z' }} // +0800 ``` 自定义日期格式: ``` {{ today | date:'yyyy-MM-dd hh:mm:ss' }} ``` **(3) filter** `filter`过滤器可以从给定数组中选择一个子集,并将其生成一个新数组返回。 `filter`过滤器的第一参数可以是字符串、对象或是一个用来从数组中选择元素的函数。 **字符串** 返回所有包含这个字符串的元素。如果我们想返回不包含该字符串的元素,在参数前加`!`符号即可。 实例(5-3.html): ``` <div ng-controller="myController"> {{ person.name | filter: 'o' }} {{ person.name | filter: '!o' }} </div> <script> myApp.controller('myController', function($scope) { $scope.person = { name: ['Tom', 'Lin', 'Bao'] }; }); </script> // ["Tom","Bao"] // ["Lin"] ``` **对象** AngularJS会将待过滤对象的属性同这个对象中的同名属性进行比较。如果属性值是字符串就会判断是否包含该字符串。 实例(5-4.html): ``` <div ng-controller="myController"> {{ person.intro | filter: {'sex': 'girl'} }} </div> <script> myApp.controller('myController', function($scope) { $scope.person = { intro: [{ 'name': 'Tom', 'sex': 'boy' }, { 'name': 'Lin', 'sex': 'girl' }, { 'name': 'Bao', 'sex': 'boy' }] }; }); </script> // [{"name":"Lin","sex":"girl"}] ``` 在上面的例子中,我们使用一个对象作为过滤对象,匹配属性"sex",且值包含"girl"的元素。 如果我们希望对全部属性都进行比较,可以将`$`当作键名。 实例(5-5.html): ``` <div ng-controller="myController"> {{ person.intro | filter: {'$': 'o'} }} </div> <script> myApp.controller('myController', function($scope) { $scope.person = { intro: [{ 'name': 'Tom', 'sex': girl' }, { 'name': 'Lin', 'sex': 'girl' }, { 'name': 'Bao', 'sex': 'boy' }] }; }); </script> // [{"name":"Tom","sex":"girl"},{"name":"Bao","sex":"boy"}] ``` 在这里使用`$`符号来对数组的元素的所有属性进行匹配,只要"name"或"sex"属性的值包含字符串`o`,就返回。 **函数** 对每个元素都执行这个函数,返回由非假值组成的新数组。 实例(5-6.html): ``` <div ng-controller="myController"> {{ num | filter: isBigger }} </div> <script> myApp.controller('myController', function($scope) { $scope.num = [1, 5, 8]; $scope.isBigger = function(num) { return num > 4; }; }); </script> // [5, 8] ``` 在上面的示例中,只有当元素值大于4时,才会返回。 注意:当filter使用自定义函数时,必须传递一个参数。 `filter`还可以传入第二个参数,用来指定预期值同实际值进行比较的方式: - true:用angular.equals(expected, actual)对两个值进行严格比较 - false:进行区分大小写的子字符串比较 - 函数:运行这个函数,如果返回真值就接受这个元素 实例(5-7.html): ``` <div ng-controller="myController"> {{ ["Tom"] | filter: 't' }} </div> // ["Tome"] ``` 当你添加第二个参数时: ``` <div ng-controller="myController"> {{ ["Tom"] | filter: 't': true }} </div> // [] ``` 可见第一个例子是模糊匹配,而第二个例子中必须是全等才会匹配。 **(4) json** `json`过滤器可以将一个JSON或JavaScript对象转换成字符串。 实例(5-8.html): ``` {{ {'name': 'angular'} | json }} // { "name": "angular" } ``` **(5) limitTo** `limitTo`过滤器会根据传入的参数生成一个新的数组或字符串,新的数组或字符串的长度取决于传入的参数,通过传入的参数的正负值来控制从前面还是从后面开始截取。 实例(5-9.html): ``` <p>{{ 'angular' | limitTo: 2 }}</p> // an <p>{{ 'angular' | limitTo: -2 }}</p> // ar <p>{{ [1, 2] | limitTo: 1 }}</p> // [1] <p>{{ 'angular' | limitTo: 9 }}</p> // angular ``` 注意:如果传入的长度值大于被操作数组或字符串的长度,那么整个数组或字符串都会被返回。 **(6) lowercase** `lowercase`过滤器将字符串转为小写。 实例: ``` {{ 'Abc' | lowercase }} // abc ``` **(7) uppercase** `uppercase`过滤器用来将字符串转换成大写。 实例: ``` {{ 'Abc' | uppercase }} // ABC ``` **(8) number** `number`过滤器将数字格式化为文本。它的第二个参数是可选的,用来控制小数点后截取的位数。 实例: ``` {{ 12345678 | number }} {{ 123.123 | number: 2 }} // 12,345,678 // 123.12 ``` 注意:“number:0”表示除掉小数后的数值,保留整数部分。 **(9) orderBy** `orderBy`过滤器可以用表达式对指定的数组进行排序。 可以接受两个参数,第一个是必需的,第二个是可选的。 第一个参数是用来确定数组排序方向: - 函数:当第一个参数是函数时,该函数会被当作待排序对象的getter方法 - 字符串:对这个字符串进行解析的结果将决定数组元素的排序方向。可以传入`+`或`-`来强制进行升序或降序排列。 - 数组: 第二个参数用来控制排序的方向(是否逆向):true/false 实例(5-10.html): ``` {{ [{'name': 'tom'}, {'name': 'jon'}, {'name': 'ao'}] | orderBy: 'name' }} // [{"name":"ao"},{"name":"jon"},{"name":"tom"}] ``` 还可以是反序: ``` {{ [{'name': 'tom'}, {'name': 'jon'}, {'name': 'ao'}] | orderBy: 'name': true }} // [{"name":"tom"},{"name":"jon"},{"name":"ao"}] ```