详解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 相关文章推荐
asp.net+jquery滚动滚动条加载数据的下拉控件
Jun 25 Javascript
XENON基于JSON变种
Jul 27 Javascript
JavaScript词法作用域与调用对象深入理解
Nov 29 Javascript
Array 重排序方法和操作方法的简单实例
Jan 24 Javascript
javascript中String对象的slice()方法分析
Dec 20 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
Jul 18 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
Jan 26 Javascript
JavaScript DOM节点操作方法总结
Aug 23 Javascript
JS+CSS3制作炫酷的弹窗效果
Nov 08 Javascript
原生javascript实现分页效果
Apr 21 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
Apr 09 Javascript
Javascript幻灯片播放功能实现过程解析
May 07 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提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
linux下为php添加iconv模块的方法
2016/02/28 PHP
JavaScript中的集合及效率
2010/01/08 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
让JavaScript中setTimeout支持链式操作的方法
2015/06/19 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
js实现横向拖拽导航条功能
2017/02/17 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
js定时器+简单的动画效果实例
2017/11/10 Javascript
Vue实现自定义下拉菜单功能
2018/07/16 Javascript
浅析vue中的MVVM实现原理
2019/03/04 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
2020/02/10 Javascript
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
python实现搜索文本文件内容脚本
2018/06/22 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
HTML5 SEO优化的一些建议
2020/08/27 HTML / CSS
Joules美国官网:出色的英国风格
2017/10/30 全球购物
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
Pottery Barn阿联酋:购买家具、家居装饰及更多
2019/12/08 全球购物
西安当代医院管理研究院笔试题
2015/12/11 面试题
Linux的文件类型
2016/07/05 面试题
本科生详细的自我评价
2013/09/19 职场文书
成龙霸王洗发水广告词
2014/03/14 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
后备干部推荐材料
2014/12/24 职场文书
消防验收申请报告
2015/05/15 职场文书
大一新生军训新闻稿
2015/07/17 职场文书