详解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 相关文章推荐
JavaScript日历实现代码
Sep 12 Javascript
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
Apr 27 Javascript
js获取图片大小的函数代码
Sep 20 Javascript
网站404页面3秒后跳到首页的实例代码
Aug 16 Javascript
javascript 数组操作详解
Jan 29 Javascript
JavaScript实现点击自动选择TextArea文本的方法
Jul 02 Javascript
JavaScript数组的栈方法与队列方法详解
May 26 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
Oct 28 Javascript
Angularjs使用指令做表单校验的方法
Mar 31 Javascript
JS回调函数基本定义与用法实例分析
May 24 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
Jun 13 Javascript
Node 模块原理与用法详解
May 13 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&amp;&amp;mysql)六
2006/10/09 PHP
PHP执行zip与rar解压缩方法实现代码
2010/12/05 PHP
php开发环境配置记录
2011/01/14 PHP
处理单名多值表单的详解
2013/06/08 PHP
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
2013/12/11 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
深入理解Javascript中this的作用域
2014/08/12 Javascript
js闭包的用途详解
2014/11/09 Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
2016/02/27 Javascript
JavaScript的==运算详解
2016/07/20 Javascript
JS作用域链详解
2017/06/26 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
使用webpack搭建vue环境的教程详解
2019/12/31 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
2020/07/18 Javascript
python pdb调试方法分享
2014/01/21 Python
Python中暂存上传图片的方法
2015/02/18 Python
Python 操作MySQL详解及实例
2017/04/30 Python
Python实现的端口扫描功能示例
2018/04/08 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
pycharm 安装JPype的教程
2019/08/08 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
django rest framework serializers序列化实例
2020/05/13 Python
python实现双人五子棋(终端版)
2020/12/30 Python
俄罗斯眼镜网: optikaworld
2016/07/31 全球购物
Aosom西班牙:家具在线商店
2020/06/11 全球购物
西安启天科技有限公司网络工程师面试题笔试题
2016/06/12 面试题
优秀团员个人的自我评价
2013/10/02 职场文书
校班主任推荐信范文
2013/12/03 职场文书
自我鉴定书面格式
2014/01/13 职场文书
开业主持词
2014/03/21 职场文书
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
表彰大会策划方案
2014/05/13 职场文书
初中毕业典礼演讲稿
2014/09/09 职场文书
自我评价优缺点范文
2015/03/11 职场文书
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android