详解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 相关文章推荐
JQuery 浮动导航栏实现代码
Aug 27 Javascript
Javascript 中文字符串处理额外注意事项
Nov 15 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
Apr 12 Javascript
原生js的弹出层且其内的窗口居中
May 14 Javascript
jquery 表格排序、实时搜索表格内容(附图)
May 19 Javascript
jquery操作select方法汇总
Feb 05 Javascript
在JavaScript中正确引用bind方法的应用
May 11 Javascript
JavaScript函数使用的基本教程
Jun 04 Javascript
javascript设计模式之对象工厂函数与构造函数详解
Jul 30 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
Oct 30 Javascript
配置一个vue3.0项目的完整步骤
Apr 26 Javascript
JavaScript数值类型知识汇总
Nov 17 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
mysql 的 like 问题,超强毕杀记!!!
2007/01/18 PHP
PHP 多维数组排序实现代码
2009/08/05 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
JavaScript 事件对象的实现
2009/07/13 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
浅谈在js传递参数中含加号(+)的处理方式
2016/10/11 Javascript
关于AngularJs数据的本地存储详解
2017/01/20 Javascript
遍历json获得数据的几种方法小结
2017/01/21 Javascript
jQuery回调方法使用示例
2017/06/26 jQuery
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
Vue实现表格批量审核功能实例代码
2019/05/28 Javascript
微信小程序从注册账号到上架(图文详解)
2019/07/17 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
vue 修改 data 数据问题并实时显示操作
2020/09/07 Javascript
详解python列表生成式和列表生成式器区别
2019/03/27 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
Python进行统计建模
2020/08/10 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
爱游人:Travelliker
2017/09/05 全球购物
台湾SHOPRO购物行家:亚洲首创影视.3C.家电.优质购物平台
2018/05/07 全球购物
奥地利智能家居和智能生活网上商店:tink.at
2019/10/07 全球购物
香港家用健身器材、运动器材及健康美容仪器专门店:FitBoxx
2019/12/05 全球购物
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
教导处工作制度
2014/01/18 职场文书
大学毕业感言50字
2014/02/07 职场文书
法学专业求职信
2014/07/15 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
2014年大学班级工作总结
2014/11/14 职场文书
工作失职自我检讨书
2015/05/05 职场文书
婚宴致辞
2015/07/28 职场文书
2016年安康杯竞赛活动总结
2016/04/05 职场文书
Django框架模板用法详解
2022/06/10 Python