`
boyitech
  • 浏览: 85513 次
  • 性别: Icon_minigender_1
  • 来自: 南通
社区版块
存档分类
最新评论

博弈AngularJS讲义(10) - 过滤器

阅读更多

  Angular过滤器主要用来格式化输出表达式的值。过滤器可以用于视图模板、控制器或者服务组件中。我们可以通过Angular的api轻松的实现过滤器。

  

如何在模板中使用过滤器

  我们可以通过如下语法在表达式中使用过滤器,类似于Linux命令行中的管道:

{{ expression | filter }}

  例如:

   {{ 12 | currency }} 将会以货币格式输出 $12.00, currency是Angular提供的过滤器。

 

 还可以将多个过滤器联合使用,语法如下:

 

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

 

过滤器可支持参数:

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

 

例如:

{{ 1234 | number:2 }} 会将1234以精度为小数点后两位的格式输出: 1234.00.

 

如何在控制器、服务及指令中使用过滤器

 我们可以通过依赖注入的方式(过滤器的名字格式为<filterName>Filter)在Angular组件中使用filter.例如注入number过滤器,则在组件的构造函数的参数中所声明的依赖的名字必须叫做numberFilter。 让我们通过具体示例来说明过滤器的用法:

 

<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>
   
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');
}]);
    在上面的控制器代码中,我们在构造方法长数组注入了filter依赖(controller('FilterController', ['filterFilter', function(filterFilter)). 接下来调用过滤器方法filterFilter(this.array, 'a')初始化了filteredArray属性,通过过滤器我们得到了含有"a"的所有名字。

 

   相比于表达式, 我们可以在其他组件中控制对过滤器的调用,表达式中filter会在每次执行的时候都被执行一遍。

 

    运行结果:

    

 

 

自定义过滤器

   通过使用Angular api自己实现一个过滤器也很方便,只需在相应模块中通过filter工厂方法注册一个过滤器即可,Angular内部则通过filterProvider实现。 工厂方法中要求返回一个新的filter方法, 该方法的第一个参数为输入值即表达式中"|"号前面的输出。返回的filter方法通常具有无状态(stateless)和幂等(idempotent)性。filter的名字需符合angular表达式的命名规范,不允许出现连字符、点号等特殊字符。

    让我们通过具体的例子来介绍如何自定义过滤器:

    

<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>
</div>
 

 

  

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', function($scope) {
  $scope.greeting = 'hello';
}]);
 

 

   这个例子中我们实现了一个简单的过滤器reverse反顺序输出字符. 在module的filter方法中,第一个参数为过滤器的名字,第二个参数为一个函数,该函数返回了真正实现过滤逻辑的过滤器函数,接收两个参数,第一个参数为需要反转的字符串,第二参数用以判断是否需要转成大写。

   在HTML模板的表达式中即可调用自定义的reverse过滤器: {{greeting|reverse}}, {{greeting|reverse:true}}。

  

  运行结果:

  

 

有状态的过滤器 

  一般情况下,不推荐实现有状态的过滤器,因为这样做不能被angular优化执行,从而导致性能问题。可以通过将内部的状态变量移到控制器中并通过传参的形式将有状态的过滤器转换成无状态的。

  如果的确需要实现带状态的过滤器则需将过滤器标记为$stateful,这也意味着过滤器会在每个$digest阶段可能被执行多次。

   

<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>

  

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: '*'});

    在上面的代码中我们实现了decorate过滤器,并声明为带状态的(decorateFilter.$stateful = true;), 这样每次decoration.symbol发生变化是,该过滤器都会执行一遍, 过滤器中绑定了decoration值。

   

  运行结果: 


 

  • 大小: 4 KB
  • 大小: 3.5 KB
  • 大小: 3.9 KB
分享到:
评论

相关推荐

    博弈AngularJS讲义(13) - 动画

    NULL 博文链接:https://boyitech.iteye.com/blog/2167272

    论文研究-不确定性下多目标博弈中弱Pareto-NS均衡的存在性.pdf

    论文研究-不确定性下多目标博弈中弱Pareto-NS均衡的存在性.pdf, 在已知不确定参数变化范围的假设下, 研究了多目标博弈中弱Pareto-NS均衡点的存在性问题. 首先结合非合作...

    耶鲁大学公开课博弈论讲义

    10. **博弈论在现实世界的应用**:如拍卖设计、市场竞争、环境保护、外交政策、资源分配等实际问题都可以用博弈论来分析和优化策略。 耶鲁大学的博弈论公开课不仅会讲解这些理论,还会通过实例和案例研究帮助学生...

    博弈论专题------博弈论

    ### 博弈论专题知识点详解 #### 一、博弈论概览 博弈论,又称对策论,是现代数学的一个重要分支,主要研究在各种策略情况下,参与者如何做出决策以达到自身利益最大化。这一理论不仅在数学领域有广泛的应用,同时...

    哈佛本科博弈论讲义教材

    哈佛大学的博弈论讲义是这个领域的权威资料之一,深受学者和学生们的喜爱。本讲义深入浅出地介绍了博弈论的基本概念、理论与应用,帮助读者理解在竞争与合作中的决策制定。 首先,我们要理解博弈论的核心概念——...

    微观经济学讲义-第13章博弈论.doc

    微观经济学讲义-第13章博弈论

    博弈论与信息经济学讲义09-1.pptx

    2. **完全信息动态博弈** - 这部分涉及博弈的动态过程,我们将深入研究子博弈精炼纳什均衡,这是考虑到博弈的各个阶段,参与者如何在每个阶段做出最优决策。 3. **不完全信息静态博弈** - 在参与者掌握的信息不完全...

    博弈论与信息经济学讲义06-4PPT课件.pptx

    例如,在智猪博弈中,大猪和小猪如何决定是否启动食物分配器,形成了一个动态的决策过程,最终得出大猪按按钮,小猪等待的子博弈精炼纳什均衡。 然后,讲义探讨了不完全信息静态博弈和动态博弈。在这些博弈中,参与...

    七所大学的博弈论讲义

    七所大学的博弈论讲义,包括哈佛大学.卡内基梅隆大学.芝加哥大学.加利福尼亚大学(圣. 迭戈校区).加利福尼亚

    势博弈与时变Log-linear分布式拓扑控制算法.pdf

    势博弈与时变Log-linear分布式拓扑控制算法 势博弈与时变Log-linear分布式拓扑控制算法是为了解决UWSNs(Underwater Wireless Sensor Networks,水下无线传感器网络)中网络拓扑控制不稳定、频繁变化引起的网络能耗...

    2019年2季度大类资产配置报告:从基本面博弈转向资金面博弈-华泰证券-20190424.pdf

    2019年2季度大类资产配置报告:从基本面博弈转向资金面博弈-华泰证券-20190424.pdf

    计算博弈第二讲-V61

    计算博弈第二讲-V61 计算博弈是自动化研究所 University of Chinese of Academy of Sciences 的一门专业普及课,旨在让学生理解博弈的基本概念、方法和应用。第二讲的主要内容是博弈表示方法、常见博弈类型和博弈的...

    博弈论与信息经济学讲义06-5PPT学习教案.pptx

    讲义第三章详细讲解了子博弈精炼纳什均衡,这是一种动态博弈的解概念,要求均衡策略不仅要在初始阶段是最佳的,而且在任何可能的子博弈中也必须是最优的。以房地产开发项目的例子来说明,开发商A和B在面对不确定市场...

    人机博弈----PDF中文版

    人机博弈。PDF中文版。。。。。。。。。。。。。。。。。。。。。。。。。

    博弈是什么意思-博弈之道须正矣.docx

    博弈是什么意思-博弈之道须正矣.docx

    博弈论与信息经济学讲义06-4学习教案.pptx

    本讲义主要涵盖了非合作博弈理论和信息经济学的核心概念。 首先,非合作博弈理论是博弈论的基础,它描述了两个或多个独立决策者之间的互动,这些决策者无法通过正式协议来协调行动。在完全信息静态博弈中,所有参与...

    博弈论与信息经济学讲义06-5学习教案.pptx

    在本讲义中,我们将探讨非合作博弈理论和信息经济学的相关概念。 首先,非合作博弈理论是博弈论的核心,主要关注参与者在没有共同利益或协议约束下的决策过程。在完全信息静态博弈中,所有参与者都掌握所有相关信息...

    奶粉行业首次覆盖报告:存量博弈,国产崛起-20210407.pdf

    奶粉行业首次覆盖报告:存量博弈,国产崛起-20210407

    博弈论与信息经济学讲义06-5PPT课件.pptx

    本讲义涵盖的内容广泛,包括了非合作博弈理论、完全信息与不完全信息博弈,以及信息经济学中的委托-代理理论和信号传递机制。 首先,非合作博弈理论是博弈论的基础,它假设参与者无法通过协议或合作改变博弈结果。...

Global site tag (gtag.js) - Google Analytics