详解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 火狐(firefox)不显示本地图片问题解决
Jul 05 Javascript
jquery+json 通用三级联动下拉列表
Apr 19 Javascript
让textarea自动调整大小的js代码
Apr 12 Javascript
JavaScript中常用的运算符小结
Jan 18 Javascript
jQuery中remove()方法用法实例
Dec 25 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
Sep 06 Javascript
ES6概念 Symbol toString()方法
Dec 25 Javascript
JS实现微信里判断页面是否被分享成功的方法
Jun 06 Javascript
关于redux-saga中take使用方法详解
Feb 27 Javascript
vue中使用gojs/jointjs的示例代码
Aug 24 Javascript
vue的for循环使用方法
Feb 12 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
Apr 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
PHP base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
基于PHP CURL获取邮箱地址的详解
2013/06/03 PHP
destoon实现首页显示供应、企业、资讯条数的方法
2014/07/15 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
thinkPHP内置字符串截取函数用法详解
2016/11/15 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
laravel接管Dingo-api和默认的错误处理方式
2019/10/25 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
Dom 学习总结以及实例的使用介绍
2013/04/24 Javascript
用jquery生成二级菜单的实例代码
2013/06/24 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
jQuery模仿单选按钮选中效果
2016/06/24 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
javascript表单控件实例讲解
2016/09/13 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
js中new一个对象的过程
2017/02/20 Javascript
JavaScript之Date_动力节点Java学院整理
2017/06/28 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
JS基于对象的特性实现去除数组中重复项功能详解
2017/11/17 Javascript
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
python随机数分布random测试
2018/08/27 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
PyQtGraph在pyqt中的应用及安装过程
2019/08/04 Python
Python MOCK SERVER moco模拟接口测试过程解析
2020/04/13 Python
django models里数据表插入数据id自增操作
2020/07/15 Python
电大毕业生自我鉴定
2014/04/10 职场文书
语文高效课堂实施方案
2014/05/03 职场文书
ktv好的活动方案
2014/08/15 职场文书
民主评议党员个人总结
2015/02/13 职场文书
刑事辩护词范文
2015/05/21 职场文书
微信小程序实现聊天室功能
2021/06/14 Javascript
Python基础教程,Python入门教程(超详细)
2021/06/24 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python
Java数组详细介绍及相关工具类
2022/04/14 Java/Android