详解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 相关文章推荐
使用TextRange获取输入框中光标的位置的代码
Mar 08 Javascript
jQuery EasyUI API 中文文档 - Dialog对话框
Nov 15 Javascript
JS中实现replaceAll的方法(实例代码)
Nov 12 Javascript
弹出最简单的模式化遮罩层的js代码
Dec 04 Javascript
js实现省市联动效果的简单实例
Feb 10 Javascript
JavaScript中通过提示框跳转页面的方法
Feb 14 Javascript
JavaScript常用本地对象小结
Mar 28 Javascript
微信小程序 less文件编译成wxss文件实现办法
Dec 05 Javascript
JavaScript基于面向对象实现的猜拳游戏
Jan 03 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
Apr 08 Javascript
mustache.js实现首页元件动态渲染的示例代码
Dec 28 Javascript
js之ajax文件上传
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 分页类实现代码
2009/12/03 PHP
php结合web uploader插件实现分片上传文件
2016/05/10 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
jQuery的初始化与对象构建之浅析
2011/04/12 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
JS下载文件|无刷新下载文件示例代码
2014/04/17 Javascript
js查找节点的方法小结
2015/01/13 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
JavaScript实现的简单烟花特效代码
2015/10/20 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
原生js实现电商侧边导航效果
2017/01/19 Javascript
详解JavaScript对象的深浅复制
2017/03/30 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
JS闭包原理与应用经典示例
2018/12/20 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
使用python判断你是青少年还是老年人
2018/11/29 Python
解析python的局部变量和全局变量
2019/08/15 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
Python爬取微信小程序Charles实现过程图解
2020/09/29 Python
python爬虫用scrapy获取影片的实例分析
2020/11/23 Python
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
规划编制实施方案
2014/03/15 职场文书
小学数学课题方案
2014/06/15 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
工程催款通知书
2015/04/17 职场文书
2015年市场部工作总结
2015/04/30 职场文书
学校少先队工作总结
2015/08/12 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP
MYSQL事务的隔离级别与MVCC
2022/05/25 MySQL