详解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 相关文章推荐
PJ Blog修改-禁止复制的代码和方法
Oct 25 Javascript
js 字符串操作函数
Jul 25 Javascript
纯js简单日历实现代码
Oct 05 Javascript
浅析JavaScript声明变量
Dec 21 Javascript
Node.js中process模块常用的属性和方法
Dec 13 Javascript
详解AngularJS跨页面传值(ui-router)
Aug 23 Javascript
angularjs数组判断是否含有某个元素的实例
Feb 27 Javascript
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
Sep 12 Javascript
iView-admin 动态路由问题的解决方法
Oct 03 Javascript
微信小程序实现星星评价效果
Nov 02 Javascript
layui异步加载table表中某一列数据的例子
Sep 16 Javascript
在webstorm中配置less的方法详解
Sep 25 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
输出控制类
2006/10/09 PHP
PHP判断是否有Get参数的方法
2014/05/05 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
javascript下高性能字符串连接StringBuffer类
2010/08/16 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
2015/03/06 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
javascript中json基础知识详解
2017/01/19 Javascript
使用nodejs+express实现简单的文件上传功能
2017/12/27 NodeJs
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
react中Suspense的使用详解
2019/09/01 Javascript
在layer弹层layer.prompt中,修改placeholder的实现方法
2019/09/27 Javascript
python实现比较两段文本不同之处的方法
2015/05/30 Python
python PIL模块与随机生成中文验证码
2016/02/27 Python
Python3.6.0+opencv3.3.0人脸检测示例
2018/05/25 Python
python利用Opencv实现人脸识别功能
2019/04/25 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
使用jupyter notebook运行python和R的步骤
2020/08/13 Python
10条PHP编程习惯
2014/05/26 面试题
学生个人求职自荐信格式
2013/09/23 职场文书
保密协议书范本
2014/04/22 职场文书
志愿者活动总结范文
2014/04/26 职场文书
校园主题婚礼活动策划方案
2014/09/15 职场文书
个人年终总结开头
2015/03/06 职场文书
企业投资意向书
2015/05/09 职场文书
工资证明格式模板
2015/06/12 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书
Pandas加速代码之避免使用for循环
2021/05/30 Python
TV动画《神废柴☆偶像》公布先导PV
2022/03/20 日漫
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers