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

博弈AngularJS讲义(9) - 表达式

阅读更多

Angular表达式

  Angular表达式类似于JS代码,有双大括号绑定,其格式为{{expression}}.

  例如:

     1+2  - 两个常量数字相加即 3

     a+b   - 作用域中的两个model相加

     user.name  - 获取作用域中属性user的name属性

     items[index]  - 获取作用域中items数组的元素

 

与JavaScript表达式的区别

  Angular看似JavaScript表达式,但是有如下一些区别:

    1.  从上下文看, JS表达式实在全局变量window的上下文中运行,而Angular表达式这在相应的作用域中(scope)工作。

    2.  从容错性上来说,在JS中如果对undefined或者null类型操作会产生ReferenceError或者TypeError之类的错误。Angular表达式则不会报错。

    3.  相比于JS, Angular表达式不支持控制流结构语句, 例如条件循环语句、异常等。

    4.  Angular提供了过滤器机制在数据展现之前对其格式化。

   如果需要在视图中调用复杂的JS代码,可以将其写在控制器方法中,或者用Angular的$eval方法。

 

让我们通过具体例子来理Angular解表达式:

    例一:

<span>
  1+2={{1+2}}
</span>

   运行结果:

 

 

   例二:

    HTML代码

<div ng-controller="ExampleController" class="expressions">
  Expression:
  <input type='text' ng-model="expr" size="80"/>
  <button ng-click="addExp(expr)">Evaluate</button>
  <ul>
   <li ng-repeat="expr in exprs track by $index">
     [ <a href="" ng-click="removeExp($index)">X</a> ]
     <tt>{{expr}}</tt> => <span ng-bind="$parent.$eval(expr)"></span>
    </li>
  </ul>
</div>

    JS代码

 

 

angular.module('expressionExample', [])
.controller('ExampleController', ['$scope', function($scope) {
  var exprs = $scope.exprs = [];
  $scope.expr = '3*10|currency';
  $scope.addExp = function(expr) {
    exprs.push(expr);
  };

  $scope.removeExp = function(index) {
    exprs.splice(index, 1);
  };
}]);

   运行结果:  

 

 

   1. 在控制器中我们给作用域定义了expr模型,并定义了个方法: addExp和removeExp.

   2. 通过ng-click为"Evaluate"按钮绑定了addExp回调,默认expr为"3*10|currency". 

   3. 通过ng-repeat,迭代展现定义的表达式“<tt>{{expr}}</tt> => <span ng-bind="$parent.$eval(expr)"></span>”, 注意在ng-bind中,由于ng-repeat会创建自己的作用域,需要通过$parent.$eval来执行表达式输出货币格式$30.00.

  

表达式上下文

   Angular没用使用JS的eval()来执行表达式, 而是通过内建的$parse服务来处理表达式。

   Angular表达式不能访问全局的JS变量(例如window, document或者location). 这种限制是有意义的,它预防了因误操作全局状态而导致的错误发生。

   Angular提供了$window和$location服务给Angular表达式间接调用window和localtion中的方法。

   例如:

   

<div class="example2" ng-controller="ExampleController">
  Name: <input ng-model="name" type="text"/>
  <button ng-click="greet()">Greet</button>
  <button ng-click="window.alert('Should not see me')">Won't greet</button>
</div>

   

angular.module('expressionExample', [])
.controller('ExampleController', ['$window', '$scope', function($window, $scope) {
  $scope.name = 'World';

  $scope.greet = function() {
    $window.alert('Hello ' + $scope.name);
  };
}]);

 

 

    在HTML模板中我们通过ng-click为"Greet"和"Won't greet"按钮分别绑定了回调$scope.greet()和window.alert('...'), 由于Angular上下文中不能访问window等全局变量,所以"Won't greet"将不会弹出alert框,而greet按钮通过$window.alert可弹出对话框。

 

容错机制

   Angular表达式对于undefined和null类型使用时不会报错,而是自动判断停止后续调用。 在JS中执行a.b.c会在a不是对象的情况下抛出异常,这在通用编程语言中是普遍的正确做法。由于Angular表达式主要用于在视图中展示,出于不同的目的,在遇到对undefined或者null类型的方法调用或获取属性时,Angular表达式会直接返回undefined,不展示任何内容,这也简化了代码,否则表达式会很复杂{{((a||{}).b||{}).c}}.

  

没有控制结构

   除了三元运算(a ? b : c), Angular不支持其他控制结构。Angular的哲学是把复杂的应用逻辑封装在控制器中而不是视图中。

 

不支持正则表达式

   为了尽量保持表达式简洁,Angular表达式不支持正则,如果需要实现复杂的模型转换,可以将这部分逻辑是现在控制器中或者过滤器中。

 

$event

   事件指令如ng-click、ng-focus会在指令的作用域中将$event对象暴露给表达式,即可通过表达式访问$event对象,这是一个jQuery事件类型的对象。

  让我们看具体的代码示例:

  

<div ng-controller="EventController">
  <button ng-click="clickMe($event)">Event</button>
  <p><code>$event</code>: <pre> {{$event | json}}</pre></p>
  <p><code>clickEvent</code>: <pre>{{clickEvent | json}}</pre></p>
</div>

 

 

    

angular.module('eventExampleApp', []).
controller('EventController', ['$scope', function($scope) {
  /*
   * expose the event object to the scope
   */
  $scope.clickMe = function(clickEvent) {
    $scope.clickEvent = simpleKeys(clickEvent);
    console.log(clickEvent);
  };

  /*
   * return a copy of an object with only non-object keys
   * we need this to avoid circular references
   */
  function simpleKeys (original) {
    return Object.keys(original).reduce(function (obj, key) {
      obj[key] = typeof original[key] === 'object' ? '{ ... }' : original[key];
      return obj;
    }, {});
  }
}]);

 

 

   运行结果:


 

      注意. 在该实例中我们在ng-click和表达式中都传入了$event,而只有ng-click可访问到$event事件,通过{{clickEvent|json}}展现, 是因为$event在ng-click的作用域中才可见,对于表达式{{$event|json}}不可见。

 

一次绑定

  如果表达式含有::前缀则表明这个表达式对模型是一次性绑定的。 一次性绑定意味着表达式只会计算一次,而不会因后续模型数据的变化而重新计算。

  让我们看如下实例:

  

<div ng-controller="EventController">
  <button ng-click="clickMe($event)">Click Me</button>
  <p id="one-time-binding-example">One time binding: {{::name}}</p>
  <p id="normal-binding-example">Normal binding: {{name}}</p>
</div>

   

angular.module('oneTimeBidingExampleApp', []).
controller('EventController', ['$scope', function($scope) {
  var counter = 0;
  var names = ['Igor', 'Misko', 'Chirayu', 'Lucas'];
  /*
   * expose the event object to the scope
   */
  $scope.clickMe = function(clickEvent) {
    $scope.name = names[counter % names.length];
    counter++;
  };
}]);

    运行结果:

    


     可以看到第一次点击往后,表达式结果都为'Igor',第二点击后由于第一个表达式是一次性绑定所以不会在赋值。一次性绑定在表达式执行一次后就接触绑定而不用循环监听,减少了资源消耗。

     对于视图中不变的常量模型,我们应优先考虑一次性绑定, 例如文本及标签,ng-repeat常量列表,指令中的不变参数等:

     

<div name="attr: {{::color}}">text: {{::name}}</div>

<ul>
  <li ng-repeat="item in ::items">{{item.name}};</li>
</ul>

 

    

someModule.directive('someDirective', function() {
  return {
    scope: {
      name: '=',
      color: '@'
    },
    template: '{{name}}: {{color}}'
  };
});

 

<div some-directive name="::myName" color="My color is {{::myColor}}"></div>

 

  • 大小: 833 Bytes
  • 大小: 4.8 KB
  • 大小: 9.3 KB
  • 大小: 3.8 KB
  • 大小: 4.3 KB
0
0
分享到:
评论

相关推荐

    博弈AngularJS讲义(13) - 动画

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

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

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

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

    非合作博弈理论是博弈论的基础,其中完全信息静态博弈是研究所有参与者都了解游戏规则和所有可能选择的情况,纳什均衡是这类博弈的关键概念,即每个参与者在考虑其他参与者策略的情况下,选择最优策略,形成一种稳定...

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

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

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

    9. **重复博弈**:在重复博弈中,同样的博弈结构会多次重复进行,玩家要考虑长远利益,这可能导致合作和信任的出现。 10. **博弈论在现实世界的应用**:如拍卖设计、市场竞争、环境保护、外交政策、资源分配等实际...

    哈佛本科博弈论讲义教材

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

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

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

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

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

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

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

    计算博弈第二讲-V61

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

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

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

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

    本讲义详细介绍了非合作博弈理论和信息经济学的相关概念。 首先,讲义涵盖了非合作博弈理论的基础,包括完全信息静态博弈。在完全信息静态博弈中,所有参与者都了解游戏的所有规则、支付矩阵和对手的策略。纳什均衡...

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

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

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

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

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

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

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

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

    博弈论及其应用-纯战略纳什均衡的应用.pptx

    文中使用了一阶必要条件进行分析,得到了纳什均衡的解析表达式。 此外,文中还讨论了反应函数的概念,反应函数是每个企业的最优战略都是其他企业战略的函数,是建立在相互影响、相互博弈的基础上的。文中还分析了...

    七所大学的博弈论讲义

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

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

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

Global site tag (gtag.js) - Google Analytics