详解AngularJS中自定义过滤器


Posted in Javascript onDecember 28, 2015

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

AngularJS中为我们提供了一些内置的过滤器,这里列举一些自定义过滤器的场景。

自定义过滤器,不带参数

//过滤 不带参数
app.filter('ordinal', function () {
return function (number) {
if (isNaN(number) || number < 1) {
return number;
} else {
var lastDigit = number % 10;
if (lastDigit === 1) {
return number + 'st'
} else if (lastDigit === 2) {
return number + 'nd'
} else if (lastDigit === 3) {
return number + 'rd'
} else if (lastDigit > 3) {
return number + 'th'
}
}
}
});

大致这样使用:

{{777 | ordinal}}

过滤 带参数

把某个位置上的字母转换成大写。

//过滤 带参数
app.filter('capitalize', function () {
//input 需要过滤的元素
//char位置,索引减一
return function (input, char) {
if (isNaN(input)) {
//如果序号位置没有设置,索引位置默认是0
var char = char - 1 || 0;
//把过滤元素索引位置上的字母转换成大写
var letter = input.charAt(char).toUpperCase();
var out = [];
for (var i = 0; i < input.length; i++) {
if (i == char) {
out.push(letter);
} else {
out.push(input[i]);
}
}
return out.join('');
} else {
return input;
}
}
});

大致这样使用:

{{'seven' | capitalize:3}}

过滤集合

过滤出集合中满足某种条件的元素。

var app = angular.module('filters', []);
app.controller('demo', function ($scope) {
$scope.languages = [
{name: 'C#', type: 'static'},
{name: 'PHP', type: 'dynamic'},
{name: 'Go', type: 'static'},
{name: 'JavaScript', type: 'dynamic'},
{name: 'Rust', type: 'static'}
];
});
//过滤集合
app.filter('staticLanguage', function () {
return function (input) {
var out = [];
angular.forEach(input, function (language) {
if (language.type === 'static') {
out.push(language);
}
});
return out;
}
});

大致这样使用:

<li ng-repeat="lang in languages | staticLanguage">{{lang.name}}</li>

过滤,带多个参数,做多件事

定义数字的显示单位和显示位置。

var app = angular.module('filters', []);
app.controller('demo', function ($scope) {
$scope.digit = 29.88;
});
//过滤 做多件事 多个参赛
app.filter('customCurrency', function () {
return function (input, symbol, place) {
if (isNaN(input)) {
return input;
} else {
//检查symbol是否有实参
var symbol = symbol || '¥';
var place = place === undefined ? true : place;
if(place===true){
return symbol+input;
}else{
return input + symbol;
}
}
}
});

大致这样使用:

<p><strong>Original:</strong></p>
<ul><li>{{digit}}</li></ul>
<p><strong>Custom Currency Filter</strong></p>
<ul>
<li>{{digit | customCurrency}} --Default</li>
<li>{{digit | customCurrency:'元'}} --custom symbol</li>
<li>{{digit | customCurrency:'元':false}} -- custom symbol and custom location</li>
</ul>

filter的两种使用方法

1. 在模板中使用filter

我们可以直接在{{}}中使用filter,跟在表达式后面用 | 分割,语法如下:

{{ expression | filter }}

也可以多个filter连用,上一个filter的输出将作为下一个filter的输入(怪不得这货长的跟管道一个样。。)

{{ expression | filter1 | filter2 | ... }}

filter可以接收参数,参数用 : 进行分割,如下:

{{ expression | filter:argument1:argument2:... }}

除了对{{}}中的数据进行格式化,我们还可以在指令中使用filter,例如先对数组array进行过滤处理,然后再循环输出:

<span ng-repeat="a in array | filter ">

2. 在controller和service中使用filter

我们的js代码中也可以使用过滤器,方式就是我们熟悉的依赖注入,例如我要在controller中使用currency过滤器,只需将它注入到该controller中即可,代码如下:

app.controller('testC',function($scope,currencyFilter){
$scope.num = currencyFilter(123534); 
}

在模板中使用{{num}}就可以直接输出 $123,534.00了!在服务中使用filter也是同样的道理。

此时你可能会有疑惑,如果我要在controller中使用多个filter,难道要一个一个注入吗,这岂不太费劲了?小兄弟莫着急~ng提供了一个$filter服务可以来调用所需的filter,你只需注入一个$filter就够了,使用方法如下:

app.controller('testC',function($scope,$filter){
$scope.num = $filter('currency')(123534);
$scope.date = $filter('date')(new Date()); 
}

可以达到同样的效果。好处是你可以方便使用不同的filter了。

Javascript 相关文章推荐
jquery中的$(document).ready()与window.onload的区别
Nov 18 Javascript
jQuery的链式调用浅析
Dec 03 Javascript
解析John Resig Simple JavaScript Inheritance代码
Dec 03 Javascript
jQuery函数的等价原生函数代码示例
May 27 Javascript
js中settimeout方法加参数
Feb 28 Javascript
js中的json对象详细介绍
Oct 29 Javascript
jquery预加载图片的方法
May 27 Javascript
jquery代码实现多选、不同分享功能
Jul 31 Javascript
jQuery查看选中对象HTML代码的方法
Jun 17 Javascript
利用jQuery实现滑动开关按钮效果(附demo源码下载)
Feb 07 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
Aug 31 Javascript
Vue请求java服务端并返回数据代码实例
Nov 28 Javascript
js运动应用实例解析
Dec 28 #Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
Dec 28 #Javascript
浅析JS运动
Dec 28 #Javascript
基于JavaScript实现网页倒计时自动跳转代码
Dec 28 #Javascript
js时间戳转为日期格式的方法
Dec 28 #Javascript
jquery实现全屏滚动
Dec 28 #Javascript
AngularJS使用angular-formly进行表单验证
Dec 27 #Javascript
You might like
php数据库配置文件一般做法分享
2012/07/07 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
Js控制弹窗实现在任意分辨率下居中显示
2013/08/01 Javascript
实例解析jQuery中proxy()函数的用法
2016/05/24 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
用jquery的attr方法实现图片切换效果
2017/02/05 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
微信小程序解析富文本过程详解
2019/07/13 Javascript
[01:14]DOTA2亚洲邀请赛 ShowOpen
2015/02/07 DOTA
python 生成不重复的随机数的代码
2011/05/15 Python
python实现对一个完整url进行分割的方法
2015/04/29 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
python读取各种文件数据方法解析
2018/12/29 Python
Python使用Pandas读写Excel实例解析
2019/11/19 Python
Python requests模块安装及使用教程图解
2020/06/30 Python
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
班队活动设计方案
2014/01/30 职场文书
完美主义个人的自我评价
2014/02/17 职场文书
亮剑观后感500字
2015/06/05 职场文书
植物园观后感
2015/06/11 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
pytorch 使用半精度模型部署的操作
2021/05/24 Python
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers
MySQL数据库表约束讲解
2022/06/21 MySQL
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技