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 相关文章推荐
javascript jscroll模拟html元素滚动条
Dec 18 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
Aug 04 Javascript
用js实现简单算法的实例代码
Sep 24 Javascript
video.js使用改变ui过程
Mar 05 Javascript
jquery实现倒计时小应用
Sep 19 jQuery
使用 Javascript 实现浏览器推送提醒功能的示例
Nov 03 Javascript
Vue使用json-server进行后端数据模拟功能
Apr 17 Javascript
vue鼠标悬停事件实例详解
Apr 01 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
Apr 02 Javascript
layui添加动态菜单与选项卡
Jul 26 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
Jul 21 Javascript
vue+iview实现手机号分段输入框
Mar 25 Vue.js
使用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
Zerg基本策略
2020/03/14 星际争霸
用PHP实现读取和编写XML DOM代码
2010/04/07 PHP
php删除文本文件中重复行的方法
2015/04/28 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
php字符串操作常见问题小结
2016/10/11 PHP
CodeIgniter框架常见用法工作总结
2017/03/16 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
js传值 判断
2006/10/26 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
2014/05/12 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
2014/06/15 Javascript
node.js中的fs.appendFileSync方法使用说明
2014/12/17 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
在AngularJS应用中实现一些动画效果的代码
2015/06/18 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
微信小程序 特效菜单抽屉效果实例代码
2017/01/11 Javascript
JS实现隔行换色的表格排序
2017/03/27 Javascript
JavaScript实现分页效果
2017/03/28 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
微信小程序日历弹窗选择器代码实例
2019/05/09 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
python数据类型_字符串常用操作(详解)
2017/05/30 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
CSS3 边框效果
2019/11/04 HTML / CSS
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
美国健康和保健平台:healtop
2020/07/02 全球购物
园林技术个人的自我评价
2014/02/15 职场文书
总经理工作职责范文
2014/03/14 职场文书
介绍信怎么写
2015/01/30 职场文书
争先创优个人总结
2015/03/04 职场文书
地道战观后感400字
2015/06/04 职场文书
微信小程序用户授权最佳实践指南
2021/05/08 Javascript
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP