AngularJs学习笔记--expression

原版地址:http://code.angularjs.org/1.0.2/docs/guide/expression

 

  表达式(Expressions)是类Javascript的代码片段,通常放置在绑定区域中(如{{expression}})。表达式通过$parse服务(http://code.angularjs.org/1.0.2/docs/api/ng.$parse)解析执行。

  例如,以下是angular中有效的表达式:

  • 1+2
  • 3*10 | currency
  • user.name

 

一、Angular表达式 vs. Js 表达式

  这很容易让人将angular视图表达式联想为javascript表达式,但这并不完全正确,因为angular不是通过javascripteval()对表达式进行求值。你可以将angular表达式想象为带有以下差异的javascript表达式:

  • 属性求值:所有属性的求值是对于scope的,而javascript是对于window对象的。
  • 宽容(forgiving):表达式求值,对于undefinednullangular是宽容的,但Javascript会产生NullPointerExceptions-_-!!!!怎么我没见过)。
  • 没有流程控制语句:在angular表达式里,我们不能做以下任何的事:条件分支、循环、抛出异常。
  • 过滤器(filters):我们可以就将表达式的结果传入过滤器链(filter chains)。例如将日期对象转换为本地指定的人类可读的格式。

  另一方面,如果我们想(在angular表达式中)执行任意的Javascript代码,我们可以将那些代码写到Controller的一个方法中并调用它。如果我们想在javascripteval()一个angular表达式,可以使用$eval()方法。

 

<!DOCTYPE HTML>
<html lang="zh-cn" ng-app="ExpressionTest">
<head>
    <meta charset="UTF-8">
    <title>expression-e1</title>
    <style type="text/css">
        .ng-cloak {
            display: none;
        }
    </style>
</head>
<body ng-controller="MyCtrl">
1 + 2 = {{1+2}}
<br/>
Expression:
<input type="text" ng-model="expr"/>
<button ng-click="addExp(expr)">Evaluate</button>
<ul>
    <li ng-repeat="expr in exprs">
        [<a ng-click="removeExp($index)" href="">X</a>]
        <tt>{{expr}}</tt>=><span ng-bind="$parent.$eval(expr)"></span>
    </li>
</ul>
<script src="../angular-1.0.1.js" type="text/javascript"></script>
<script type="text/javascript">
    var app = angular.module("ExpressionTest", []);
    app.controller("MyCtrl", 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);
        };
    });
</script>
</body>
</html>

 

 

二、属性求值(Property Evaluation

  angular的表达式解析环境的上下文是scope,而javascript则是window(应该是指严格模式evel的时候),angular需要通过$window访问global window对象。例如,如果我们需要在表达式中调用定义在window对象上的alert(),我们需要使用$window.alert()。这样做的用意是避免意外访问了公共属性(global state)(一个同源的小BUGa common source of subtle bugs)。

<!DOCTYPE HTML>
<html lang="zh-cn" ng-app="PropertyEvaluation">
<head>
    <meta charset="UTF-8">
    <title>PropertyEvaluation</title>
    <style type="text/css">
        .ng-cloak {
            display: none;
        }
    </style>
</head>
<body>
<div ng-controller="MyCtrl">
    Name: <input ng-model="name" type="text"/>
    <button ng-click="greet()">Greet</button>
</div>
<script src="../angular-1.0.1.js" type="text/javascript"></script>
<script type="text/javascript">
    var app = angular.module("PropertyEvaluation", []);
    app.controller("MyCtrl", function ($scope,$window) {
        $scope.name = "Kitty";
        $scope.greet = function() {
            $window.alert("Hello " + $scope.name);
        };
    });
</script>
</body>
</html>

 

三、Forgiving(宽容,容错?)

  表达式求值对undefinednull是宽容的。在javascript中,当a不是object的时候,对a.b.c求值,那么将会抛出一个异常。有时候这对于通用语言来说是合理的,而表达式求值主要用于数据绑定,一般形式如下:

   {{a.b.c}}

   如果a不存在,没有任何显示似乎比抛出异常更加合理(除非我们等待服务端响应,不一会儿就会被定义)。如果表达式求值时不够宽容,那么我们如此混乱地写绑定代码:

   {{((a||{}).b||{}).c}}    //这……

   相似地,引用一个函数a.b.c()时,如果它是undefined或者null,那么简单地返回undefined

 

四、没有控制流程语句(No Control Flow Statements

  我们不可以在表达式中写流程控制语句。背后的原因是,angular的核心体系是应用的逻辑应当在controller(的scope)里面,而不是在view里面。如果我们需要在视图表达式中加入条件分支、循环或者抛出异常的话,可以委托javascript方法去代替(可以调用scope中的方法)。

 

五、过滤器(Filters

  当我们向用户呈现数据时,我们可能需要将数据从原始格式转换为友好(可读性强)的格式。例如,我们有一个数据对象需要在显示给用户之前根据地域进行格式化。我们可以将表达式传递给一连串的过滤器,如:

  name | uppercase

   这表达式求值器可简单地传递name的值到uppercase过滤器中。

  链式过滤器使用这种语法:

  value | filter1 | filter2

   我们也可以传送用冒号分割的参数到filter中,例如,以两位小数的格式显示123

  123 | number:2

 

六、前缀”$”

  我们可能会感到奇怪,前缀”$”的意义是什么?它是angular为了使本身的API名称能够区别于其他的API而使用的一个简单的前缀(防止冲突)。如果angular不使用$,那么对a.length()求值将返回undefined。因为aangular本身都没有定义这个属性。

  考虑到angular将来的版本可能会选择增加length这个方法,这将令这个表达式的行为发生改变。更糟糕的是,我们开发者可能会创建一个length属性,那么将与angular发生冲突。这个问题存在因为angular通过增加方法扩展了当前存在的对象。通过加入前缀”$”,angular保留了特定的namespace,所以angular的开发者与使用angular的开发者都可以和谐共处。

 

by Lcllao

转载于:https://www.cnblogs.com/lcllao/archive/2012/09/16/2687162.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 张正友标定法是一种相机标定方法,可以用于确定相机内部参数和外部参数。该方法基于相机成像原理,通过拍摄不同角度的标定板图像,利用图像中的特征点计算相机的内部参数和外部参数。该方法具有精度高、适用范围广等优点,被广泛应用于机器视觉、三维重建等领域。 该方法的具体步骤包括:选择标定板、拍摄标定板图像、提取图像特征点、计算相机内部参数和外部参数。其中,选择标定板需要考虑标定板的大小、形状、特征点数量等因素;拍摄标定板图像需要保证标定板在不同角度下都能被完整拍摄到;提取图像特征点需要使用特征点检测算法,如SIFT、SURF等;计算相机内部参数和外部参数需要使用张正友标定法的数学模型,通过最小化重投影误差来求解。 在实际应用中,张正友标定法需要注意以下几点:标定板需要保持平整,避免出现弯曲、扭曲等情况;标定板需要在不同角度下拍摄多张图像,以提高标定精度;标定板需要在光线充足、均匀的环境下进行拍摄,避免光线不足或过强导致标定精度下降。 总之,张正友标定法是一种重要的相机标定方法,掌握该方法对于机器视觉、三维重建等领域的研究具有重要意义。 ### 回答2: 张正友标定法是用于相机投影模型标定的一种方法,其原理是在一组已知物点与其图像坐标的情况下,通过求解相机内参矩阵和外参矩阵,从而得出相机的几何参数,可用于后续的相机运动估计和三维重建。 首先,需要准备一组已知的物点和其对应的图像坐标。物点最好组成一个三维坐标系,如在测量机中通过三维测量得到。接下来,通过张正友标定法求解相机的内参矩阵。内参矩阵包括了相机的焦距、像素尺寸、主点位置等参数,这些参数决定了像素坐标与实际物理坐标之间的转换关系。通过一些数学推导,可以得到内参矩阵的表达式,并且可以通过已知的物点和相应的图像坐标求解出内参矩阵。 接下来,需要求解相机的外参矩阵,即相机坐标系相对于物点坐标系的位姿关系。通过张正友标定法,可以得到物点在相机坐标系下的坐标,从而求解出相机的外参矩阵。外参矩阵包括了相机的旋转矩阵和平移向量,这些参数描述了相机在物点坐标系下的位姿。 最后,通过内参矩阵和外参矩阵,可以将相机坐标系下的物点坐标转换成像素坐标,从而可用于后续的三维重建和相机运动估计。需要注意的是,在实际应用中,因为测量误差和噪声的存在,标定误差会影响到后续的应用效果,所以需要对标定结果进行一定的误差分析和修正。 总而言之,张正友标定法是一种基于已知物点和其图像坐标的相机标定方法,通过求解相机的内参矩阵和外参矩阵,可得到相机的几何参数,进而实现三维重建和相机运动估计等应用,具有广泛的应用价值。 ### 回答3: 张正友标定法是一种常用的摄像机标定方法,它的主要思想是通过成像偏移量和焦距的测量来确定相机的内参矩阵和外参矩阵,从而实现对摄像机的校准。张正友标定法的流程主要分为以下几个步骤。 第一步,数据采集。采集一组已知尺寸的平面图案,例如棋盘格,同时记录下相机对图案的姿态(位置和姿态),姿态可以通过用相机拍摄不同姿态下的图案来得到。 第二步,提取图案角点。使用角点检测算法,例如Harris角点检测、SIFT角点检测等,从图像中提取出每个格子的四个角点。 第三步,计算图像坐标。对于每个角点,根据相机的内参矩阵和外参矩阵,可以计算出其在图像中的坐标。 第四步,标定相机内部参数。利用上一步得到的图像坐标和对应的实际坐标,使用最小二乘法等求解相机的内参矩阵。 第五步,标定相机外部参数。同样利用上一步得到的图像坐标和对应的实际坐标,使用求解PnP问题的算法可以得到相机的外参矩阵。 通过以上步骤,就可以获得相机的内参矩阵和外参矩阵,从而实现对摄像机的标定。在实际应用中,可以将标定结果用于建立相机-世界坐标系之间的转换关系,进而实现摄像机与物体的三维空间定位和跟踪等应用。 总之,张正友标定法是一种基于对摄像机成像原理的理解和应用的标定方法,是计算机视觉和机器视觉领域中常用的技术之一,也是深度学习等领域的前置步骤。掌握该方法的原理和实现技巧,对于进一步深入了解计算机视觉和机器视觉技术体系,以及开展实际应用有着重要的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值