《AngularJS实战》——2.1  Angular中的表达式

2.1  Angular中的表达式

在Angular中,表达式是运用在视图中的一个段代码,例如在第1章的示例1-2中,在计算两个数据的和时,双花括号中就是一个数值表达式,其中的值是通过调用$parse服务模块进行解析的。如果需要格式化表达式中的值,也可以调用Angular中的过滤器,例如在第1章示例1-2中,管道符“|”之后的“number:0”则调用了整数型过滤器。

2.1.1 Angular表达式与JavaScript表达式的区别

虽然都是表达式,但Angular中的表达式与传统的JavaScript中的表达式还是有明显的区别,具体表现在以下几个方面。
Angular中所有表达式的值都来源于$scope对象,由该对象以添加属性的方式统一进行设置,并不像在传统的JavaScript中,可以由全局的window对象来调用表
达式。
Angular中表达式的容错能力很强,可以允许值出现null和undef?ined情况,而不会像在传统JavaScript中那样抛出异常代码。
由于Angular中表达式的值的来源固定,因此,在表达式中,不允许出现各类判断和循环语句,这一点也与传统的JavaScript区别较大,在使用时需要注意。
Angular中表达式的值可以是使用管道符“|”进行格式化显示的数值,这也是不同于传统的JavaScript中表达式的一个很明显的特征。
既然Angular中的表达式与传统的JavaScript中的表达式区别很大,那么,两者之间可以相互调用吗?答案是肯定的,如果在Angular中的表达式要调用传统的JavaScript代码,需要在控制器中定义一个方法,然后由表达式调用该方法即可;而如果在传统的JavaScript代码中执行Angular中的表达式,则需要借助$eval()方法。
接下来,我们通过一个完整的示例来介绍Angular表达式与JavaScript表达式两者之间的相互调用过程。
示例2-1 Angular表达式与JavaScript表达式之间的相互调用
(1)功能描述
在页面中,当单击“计算”按钮时,将调用控制器中的“testExp1”方法,获取第一个文本框中的值并加1,然后将结果显示在浏览器的控制台中;当改变第二个文本中的Angular表达式内容时,调用$eval方法,将该表达式的结果显示在元素中。
(2)实现代码
新建一个HTML文件2-1.html,加入如代码清单2-1所示的代码。
代码清单2-1 Angular表达式与JavaScript表达式之间的相互调用

<!doctype html>
<html ng-app>
<head>
    <title>Angular与JavaScript表达式之间的相互调用</title>
    <script src="../Script/angular.min.js"
            type="text/javascript"></script>
</head>
<body>
    <div ng-controller="c2_1">
        执行JavaScript表达式:<br />
        <input type='text' ng-model="expr1" />
        <button ng-click="testExp1(expr1)">计算</button>
        <br /><br />
        执行Angular表达式:<br />
        <input type='text' ng-model="expr2" />
        <span ng-bind="$eval(expr2)"></span>
    </div>
    <script type="text/javascript">
        function c2_1($scope) {
            $scope.expr1 = 20;
            $scope.expr2 = '20+1|number:0';
            $scope.testExp1 = function (expr) {
                var newv = parseInt(expr) + 1;
                console.log(newv);
            }
        }
    </script>
</body>
</html>

(3)页面效果
执行HTML文件2-1.html,最终实现的页面效果如图2-1所示。

(4)源码分析
在本示例的源码中,为了在单击“计算”按钮时能执行JavaScript表达式,我们在控制器中自定义了一个名为“testExp1”的函数,该函数的功能是获取传入的数值,并将其传递给一个表达式,再将经表达式计算后的结果显示在浏览器的控制台中,这些代码全部采用传统的JavaScript编写。此外,在页面中将该函数与“计算”按钮的单击事件(ng-click)绑定,最终实现在单击该按钮时执行自定义的“testExp1”函数的功能。
接下来,在第二个文本框元素和元素中,分别通过数据绑定的方式关联在控制器中设置的相应属性值,而在绑定元素时,又调用了$eval方法对绑定的属性值直接进行解析。由于Angular的数据绑定是双向的,因此,当改变第二个文本框中的Angular表达式内容时,在元素中执行该表达式后的结果也会自动发生变化,最终效果如图2-1所示。

2.1.2 $window窗口对象在表达式中的使用

如果在控制器中调用JavaScript代码中的全局对象window时,需要通过依赖注入的$window对象来替代window,即如果是window.alert,应该将控制器的代码修改为:$window.alert,因为每一个控制器的代码只是在它管辖的作用区域中使用。通过这样的写法,可以防止它与全局的window对象混淆,出现各类诡异的异常。
接下来,我们通过一个完整的示例来介绍$window对象使用的过程。
示例2-2 $window窗口对象在表达式中的使用
(1)功能描述
在页面中,当单击“显示”按钮时,调用控制器中的show方法,以弹出窗口的方式显示文本框中输入的内容。
(2)实现代码
新建一个HTML文件2-2.html,加入如代码清单2-2所示的代码。
代码清单2-2 $window窗口对象在表达式中的使用

<!doctype html>
<html ng-app>
<head>
    <title>$window窗口对象在表达式中的使用</title>
    <script src="../Script/angular.min.js"
            type="text/javascript"></script>
</head>
<body>
    <div ng-controller="c2_2">
        <input type='text' ng-model="text" />
        <button ng-click="show()">显示</button>
    </div>
    <script type="text/javascript">
        function c2_2($window, $scope) {
            $scope.text = "";
            $scope.show = function () {
                $window.alert("您输入的内容是: " + $scope.text);
            }
        }
    </script>
</body>
</html>

(3)页面效果
执行HTML文件2-2.htm,最终实现的页面效果如图2-2所示。
(4)源码分析
在本示例的代码中,在自定义控制器函数c2_2时,添加了一个$window对象,用于取代全局性的window对象。在使用时,可以像访问window对象一样,调用$window对象中各类方法或属性,如alert、conf?irm等。另外,在代码中,由于文本框与$scope的“text”属性进行了数据绑定,因此,只要文本框输入的内容发生变化,对应的$scope.text属性值也随之改变,所以,弹出的窗口能即时动态显示在文本框中输入的内容值。

2.1.3 Angular表达式的容错性

与传统的JavaScript表达式相比,Angular表达式的容错能力更强大,它允许表达的值为undef?ined或null类型,而在传统的JavaScript表达式中,如果出现这两种类型,则会抛出“ReferenceError”类型的错误提示。
接下来,我们通过一个完整的示例来介绍Angular表达式的容错性。
示例2-3 Angular表达式的容错性
(1)功能描述
在页面中,将一个未定义的属性值与文本框绑定,另外,在单击“单击”按钮时,在浏览器的控制台中输入一个未定义的变量值,分别观察两者在页面控制台上的显示信息。
(2)实现代码
新建一个HTML文件2-3.html,加入如代码清单2-3所示的代码。
代码清单2-3 Angular表达式的容错性

<!doctype html>
<html ng-app>
<head>
    <title>Angular表达式中的容错性</title>
    <script src="../Script/angular.min.js"
            type="text/javascript"></script>
</head>
<body>
    <div ng-controller="c2_3">
        <span>{{tmp}}</span>
        <button ng-click="error();">单击</button>
    </div>
    <script type="text/javascript">
        function c2_3($scope) {
            $scope.temp = "Angular";
            $scope.error = function () {
                console.log(tmp);
            }
        }
    </script>
</body>
</html>

(3)页面效果
执行HTML文件2-3.html,最终实现的页面效果如图2-3所示。

(4)源码分析
在本示例中,虽然页面中的元素绑定了一个未定义的Angular表达式,但由于该表达式具有很好的容错性,允许使用未定义或空值表达式,因此,浏览器的控制台并没有异常信息显示。
当单击页面中的“单击”按钮时,将执行在控制器中自定义的error函数,在该函数中将一个未定义的变量“tmp”输出至控制台。从控制台显示的信息可以看出,由于未定义被打印的变量“tmp”,因此,使用未定义的变量将在JavaScript代码中抛出“ReferenceError”类型异常,详细效果如图2-3所示。
通过上面几个示例的介绍,我们明显感觉Angular表达式的性能要比传统的JavaScript强大不少。但在实际使用Angular工具开发应用时,如果在页面中使用表达式,不能将逻辑性的判断语句或循环语句写入表达式中,因为在Angular中,这类页面的应用逻辑必须写在管理页面的控制器代码中,而不是直接写在页面的表达式中,这点需要在使用Angular表达式时注意。

时间: 2024-10-05 08:04:30

《AngularJS实战》——2.1  Angular中的表达式的相关文章

《AngularJS实战》——2.2 Angular中的控制器

2.2 Angular中的控制器 在介绍完Angular中的表达式后,接下来再来介绍一下Angular中一个重要角色--控制器(controller).其实,在前面的章节中我们也多次提到它,那么,Angular中的控制器到底是什么?它又能实现哪些功能呢?接下来,我们结合示例来逐一进行解析. 2.2.1 控制器的概念 控制器在Angular中占有重要的地位,它是组成前端MVC框架的一员.在Angular中,控制器的功能是管理页面的逻辑代码.当控制器通过"ng-controller"指令被

《AngularJS实战》——导读

前 言 为何写作本书 随着互联网技术的发展,尤其是移动互联网技术的兴起和迅速壮大,前端应用的开发并非简单静态页的制作,越来越多的功能复杂的动态应用由前端来完成.但是,在实现的过程中,前端技术自身有许多的不足,很难实现某些复杂功能.为克服自身的不足,往往需要借助一些常用的类库和框架,如jQuery和Backbone等,但这些外部引入的类库或框架只方便了代码开发,并未从根本上改变页面结构.为了从根本上克服静态页在应用开发过程中的不足,我们引入了AngularJS框架. AngularJS是目前最热门

详解AngularJS中的表达式使用

  这篇文章主要介绍了详解AngularJS中的表达式使用,包括处理数字和字符串等各种对象的操作,需要的朋友可以参考下 表达式用于应用程序数据绑定到HTML.表达式都写在双括号就像{{表达式}}.表达式中的行为跟ng-bind指令方式相同. AngularJS应用表达式是纯javascript表达式,并输出它们被使用的数据在那里. 使用数字 ? 1 <p>Expense on Books : {{cost * quantity}} Rs</p> 使用字符串 ? 1 <p>

《AngularJS实战》——3.1 模板中的过滤器

3.1 模板中的过滤器 过滤器的主要功能是格式化数据,这里所说的数据,既包括视图模板中的表达式,也包括控制器中的数组或对象.开发人员不仅可以方便地调用Angular中提供的过滤器,还可以自定义属于自己的过滤器.接下来,我们通过一些实用的案例,来介绍过滤器的强大功能. 3.1.1 排序方式过滤 在介绍排序(orderBy)过滤器之前,先来了解一下过滤器的使用格式.在Angular中,过滤器有3种调用方式,分别为单个过滤器.多个过滤器和带参数的过滤器,它们分别对应不同的使用格式,下面分别进行介绍.

《AngularJS实战》——1.1 Angular简介

1.1 Angular简介 从开始的概述中我们知道,Angular是基于HTML基础进行扩展的开发工具,其扩展的目的就是希望能通过HTML标签构建动态的Web应用.要实现这样的目的,需要在Angular内部利用了两项技术点,一个是数据的双向绑定,另一个是依赖注入.下面我们来简单介绍这两个新概念.在Angular中,数据绑定可以通过{{}}双花括号的方式向页面的DOM元素中插入数据,也可以通过添加元素属性的方式绑定Angular的内部指令,实现对元素的数据绑定,这两种形式的数据绑定都是双向同步的,

《AngularJS实战》——第3章 Angular的过滤器和作用域

第3章 Angular的过滤器和作用域在第2章介绍完Angular中的基础知识后,我们将在本章中进一步介绍Angular的另外两个重要的概念--过滤器和作用域.过滤器的功能是格式化数据表达式,只要有数据表达式的地方就可以使用过滤器,如页面模板视图.控制器,在服务中都可能使用过滤器,并且还可以自定义过滤器.与过滤器单一的功能不同,作用域(scope)是Angular中的另一个非常重要的概念,它主要服务于页面模板,在控制器与页面中起桥梁作用,保存模板中的数据对象,为模板中的元素提供方法和属性.在本章

《AngularJS实战》——1.2 开发简单的Angular应用

1.2 开发简单的Angular应用 首先,我们来编写一个简单的Angular应用,参见下列的示例.示例1-1 编写一个简单的Angular程序(1)功能描述当页面加载时,在页面的正文部分显示"Hello,欢迎来到angular世界!"的字样.(2)实现代码新建一个HTML文件1-1.html,加入如代码清单1-1所示的代码.代码清单1-1 第一个简单的Angular程序 <!doctype html> <html ng-app> <head> &l

《AngularJS实战》——第2章 Angular基础知识

第2章 Angular基础知识通过上一章对Angular的简单介绍,相信读者对使用Angular开发Web应用有了一个大致的了解.由于Angular是一个全新的开发工具,因此需要掌握许多必要的基础概念.本章将从最底层的知识讲起,由浅入深地带领大家了解并掌握Angular开发工具中的表达式.控制器.模板和模板中的过滤器这些必须了解的基础知识.

基于angular中的重要指令详解($eval,$parse和$compile)_AngularJS

在angular的服务中,有一些服务你不得不去了解,因为他可以说是ng的核心,而今天,我要介绍的就是ng的两个核心服务,$parse和$compile.其实这两个服务讲的人已经很多了,但是100个读者就有100个哈姆雷特,我在这里讲讲自己对于他们两个服务的理解. 大家可能会疑问,$eval呢,其实他并不是一个服务,他是scope里面的一个方法,并不能算服务,而且它也基于parse的,所以只能算是$parse的另一种写法而已,我们看一下ng源码中$eval的定义是怎样的就知道了 $eval: fu