Angularjs中使用Filters详解


Posted in Javascript onMarch 11, 2016

Filter作用就是接收一个输入,通过某个规则进行处理,然后给用户返回处理后的结果。Filter可以用在模板、控制器、或者服务,同时也会很容易自定义一个Filter过滤器。

在模板中使用Filter

Filter可以用于在视图模板中使用一下语法表达式:

{{ expression | filter }}

例如:格式{{ 12 | currency }}是使用currency的filter用法,让数字12过滤为货币形式,结果是$12.00。

Filter可以应用到另一个过滤的结果中。这就是所谓的“chaining”,使用语法如下:

{{ expression | filter1 | filter2 | ... }}

Filter中可能需要参数。语法为:

{{ expression | filter:argument1:argument2:... }}

例如:格式{{ 1234 | number:2 }}是使用number的filter用法,将数字1234过滤为有两位小数点的数字,结果为:1,234.00 。

在controller、services、directives中使用filter

 你可以在controller、services、directives中使用filter。

为此,你需要将依赖项名称注入到你的controller/service/directive中:filter;例如:一个过滤器是number,你就需要通过使用依赖注入numberFilter。注入的参数是一个函数,该函数将值作为第一个参数,然后用第二个参数来筛选参数。

下面的例子使用了叫做filter的Filter过滤器。这个filter可以在sub arrays的基础上减少arrays。也可以应用在视图模板的标记,就像:{{ctrl.array|filter:'a'}},这将为‘a'做一个全文搜索。然而,在视图模板中使用filter将会重新对每一个filter过滤,如果数组比较大的会是加载多次的。

因此下面的例子直接调用在控制器中的filter。通过这个,控制器可以在需要是调用filter(例如:当后端数据加载时或者filter的表达式改变时)。

index.html:

<div ng-controller="FilterController as ctrl">
 <div>
  All entries:
  <span ng-repeat="entry in ctrl.array">{{entry.name}} </span>
 </div>
 <div>
  Entries that contain an "a":
  <span ng-repeat="entry in ctrl.filteredArray">{{entry.name}} </span>
 </div>
</div>

script.js:

angular.module('FilterInControllerModule', []).
controller('FilterController', ['filterFilter', function(filterFilter) {
 this.array = [
  {name: 'Tobias'},
  {name: 'Jeff'},
  {name: 'Brian'},
  {name: 'Igor'},
  {name: 'James'},
  {name: 'Brad'}
 ];
 this.filteredArray = filterFilter(this.array, 'a');
}]);

结果为:

All entries: Tobias Jeff Brian Igor James Brad
Entries that contain an "a": Tobias Brian James Brad

创建自定义filters:

编写自己的filter是非常简单的:只需要在你的模块中注册一个新的filter factory函数。在内部,这里用了filterProvider。这个factory函数应该返回一个新的filter函数并且将输入值作为第一个参数。任何过滤器参数都会作为附加参数传递到过滤器函数中。

这个过滤器函数应该是一个单纯的函数。这意味着它应该stateless 和 idempotent。当输入的函数变化时,angular依赖这些属性并且执行filter。

注意:filter的名称必须是有效的angular表达式标识符。例如uppercase或者orderBy。名字是不允许有特殊的字符,如连字符和点是不允许的。如果你希望你的过滤器有名称空间,那么你可以使用大写(myappSubsectionFilterx)或者下划线(myapp_subsection_filterx)。

下面的示例filter是反写一个字符串。另外,它可以再加一个条件使字符串大写。

index.html

<div ng-controller="MyController">
 <input ng-model="greeting" type="text"><br>
 No filter: {{greeting}}<br>
 Reverse: {{greeting|reverse}}<br>
 Reverse + uppercase: {{greeting|reverse:true}}<br>
 Reverse, filtered in controller: {{filteredGreeting}}<br>
</div>

script.js

angular.module('myReverseFilterApp', [])
.filter('reverse', function() {
 return function(input, uppercase) {
  input = input || '';
  var out = "";
  for (var i = 0; i < input.length; i++) {
   out = input.charAt(i) + out;
  }
  // conditional based on optional argument
  if (uppercase) {
   out = out.toUpperCase();
  }
  return out;
 };
})
.controller('MyController', ['$scope', 'reverseFilter', function($scope, reverseFilter) {
 $scope.greeting = 'hello';
 $scope.filteredGreeting = reverseFilter($scope.greeting);
}]);

结果为:

No filter: hello
Reverse: olleh
Reverse + uppercase: OLLEH
Reverse, filtered in controller: olleh

有状态的filters(Stateful filters)

强烈建议写有状态的filters,因为这些不能用angular进行优化,这往往会导致性能问题。许多有状态的filters转换成无状态的filters仅仅通过揭露隐藏的状态作为model,并且将其转化为一个filter参数。

然而,如果你需要写一个有状态的filters,你必须将filter标记为$stateful,这也就意味着它将在每一个$digest周期内执行一次或多次。

index,html

<div ng-controller="MyController">
 Input: <input ng-model="greeting" type="text"><br>
 Decoration: <input ng-model="decoration.symbol" type="text"><br>
 No filter: {{greeting}}<br>
 Decorated: {{greeting | decorate}}<br>
</div>

script.js:

angular.module('myStatefulFilterApp', [])
.filter('decorate', ['decoration', function(decoration) {

 function decorateFilter(input) {
  return decoration.symbol + input + decoration.symbol;
 }
 decorateFilter.$stateful = true;

 return decorateFilter;
}])
.controller('MyController', ['$scope', 'decoration', function($scope, decoration) {
 $scope.greeting = 'hello';
 $scope.decoration = decoration;
}])
.value('decoration', {symbol: '*'});

结果为:

No filter: hello
Decorated: *hello*

下次会写一篇angularjs中filter的常用用法。

Javascript 相关文章推荐
kmock javascript 单元测试代码
Feb 06 Javascript
Jquery提交表单 Form.js官方插件介绍
Mar 01 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
Dec 14 Javascript
js实现用户注册协议倒计时的方法
Jan 21 Javascript
纯JS代码实现隔行变色鼠标移入高亮
Nov 23 Javascript
微信小程序 WebSocket详解及应用
Jan 21 Javascript
详谈js中window.location.search的用法和作用
Feb 13 Javascript
js时间查询插件使用详解
Apr 07 Javascript
JS实现页面内跳转的简单代码
Sep 03 Javascript
Vue.js 踩坑记之双向绑定
May 03 Javascript
jQuery easyui datagird编辑行删除行功能的实现代码
Sep 20 jQuery
jQuery实现图片随机切换、抽奖功能(实例代码)
Oct 23 jQuery
使用jquery.qrcode.min.js实现中文转化二维码
Mar 11 #Javascript
JavaScript制作简单的日历效果
Mar 10 #Javascript
js滑动提示效果代码分享
Mar 10 #Javascript
js实现页面跳转的五种方法推荐
Mar 10 #Javascript
js实现页面跳转的五种方法推荐
Mar 10 #Javascript
js实现上一页下一页的效果【附代码】
Mar 10 #Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
Mar 10 #Javascript
You might like
PHP 学习路线与时间表
2010/02/21 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
js onload事件不起作用示例分析
2013/10/09 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
2020/09/09 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
python操作ie登陆土豆网的方法
2015/05/09 Python
python基础教程项目三之万能的XML
2018/04/02 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
Python程序暂停的正常处理方法
2019/11/07 Python
Django继承自带user表并重写的例子
2019/11/18 Python
2020版Python学习路线图(附学习资料)
2020/09/15 Python
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
JRE、JDK、JVM之间的关系怎样
2012/05/16 面试题
函授教育个人学习的自我评价
2013/12/31 职场文书
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
借条如何写
2015/05/26 职场文书
2015暑假实习报告范文
2015/07/13 职场文书
办公室卫生管理制度
2015/08/04 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书