详解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 相关文章推荐
document.open() 与 document.write()的区别
Aug 13 Javascript
页面中iframe相互传值传参
Dec 13 Javascript
简单实例处理url特殊符号&amp;处理(2种方法)
Apr 02 Javascript
用js一次改变多个input的readonly属性值的方法
Jun 11 Javascript
Visual Studio中js调试的方法图解
Jun 30 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
Mar 05 Javascript
JavaScript中动态向表格添加数据
Jan 24 Javascript
angular实现表单验证及提交功能
Feb 01 Javascript
js实现省份下拉菜单效果
Feb 15 Javascript
JavaScript中创建对象的7种模式详解
Feb 21 Javascript
angular2中Http请求原理与用法详解
Jan 11 Javascript
详解基于vue的服务端渲染框架NUXT
Jun 20 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 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
javascript基础的动画教程,直观易懂
2007/01/10 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
2012/04/14 Javascript
javascript检测页面是否缩放的小例子
2013/05/16 Javascript
jquery对单选框,多选框,文本框等常见操作小结
2014/01/08 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
Angular实现form自动布局
2016/01/28 Javascript
轮播的简单实现方法
2016/07/28 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
浅谈在js传递参数中含加号(+)的处理方式
2016/10/11 Javascript
Ionic3实现图片瀑布流布局
2017/08/09 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
python 正则式使用心得
2009/05/07 Python
Python学习笔记之常用函数及说明
2014/05/23 Python
python中stdout输出不缓存的设置方法
2014/05/29 Python
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
python实现弹跳小球
2019/05/13 Python
python绘制彩虹图
2019/12/16 Python
python关于变量名的基础知识点
2020/03/03 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
css3 border-image使用说明
2010/06/23 HTML / CSS
名人演讲稿范文
2013/12/28 职场文书
高中军训第一天感言
2014/03/06 职场文书
行政内勤岗位职责
2014/04/07 职场文书
2014年五一劳动节社区活动总结
2014/04/14 职场文书
市场拓展计划书
2014/05/03 职场文书
中国梦读书活动总结
2014/07/10 职场文书
组工干部演讲稿
2014/09/02 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
使用Ajax实现进度条的绘制
2022/04/07 Javascript