《AngularJS实战》——3.3 作用域概述

3.3 作用域概述

在前面的章节中我们曾经介绍过$scope对象,确切来说,它的实质就是一个作用域对象。从对这个对象的使用,我们发现作用域能存储数据模型、为表达式提供上下文环境和监听表达式的变化并且传播事件,它是页面视图与控制器之间的重要桥梁,也是掌握Angular必须知道的基础概念,接下来,我们详细介绍它的基础功能和在DOM中的使用方法。

3.3.1 作用域特点

具体来说,作用域包括下列3个比较显著的特点。
它提供了一个$watch方法来监听数据模型的变化,之所以能使用“ng-model”指令实现数据的双向绑定,就是通过调用该方法进行数据模型的监听,只要有一端发生变化,另外绑定的一端自动进行数据同步。
它提供另外一个$apply方法,为各种类型的数据模型改变提供支撑,将它们引入到Angular可控制器的范围中。最典型的就是控制器,例如,通过页面视图模板中“ng-click”指令,执行控制器中的代码。
它为表达式提供了执行的环境,一个表达式必须在拥有该表达式属性的作用域中执行才更加合适,作用域通过提供$scope对象,使所有的表达式都拥有对应的执行环境,也就是执行的上下文对象。
接下来,通过一个完整的示例来介绍作用域下调用$watch方法监听数据模块的变化。
示例3-6 $watch方法的使用
(1)功能描述
当在页面的文本框中输入任意“姓名”字符时,另一个

元素中将显示输入框中字符变化的累计次数。
(2)实现代码
新建一个HTML文件3-6.html,加入如代码清单3-6所示的代码。
代码清单3-6 $watch方法

<!doctype html>
<html ng-app="a3_6">
<head>
    <title>$watch方法</title>
    <script src="../Script/angular.min.js"
            type="text/javascript"></script>
    <style type="text/css">
        body {
            font-size: 12px;
        }
        div{
            margin:8px 0px;
        }
    </style>
</head>
<body>
    <div ng-controller="c3_6">
        <div><input type="text"
                    ng-model="name" placeholder="请输入姓名"/>
        </div>
        <div>累计变化次数: {{count}}</div>
    </div>
    <script type="text/javascript">
        var a3_6 = angular.module('a3_6', []);
        a3_6.controller('c3_6', ['$scope', function ($scope) {
            $scope.count = 0;
            $scope.name = '';
            $scope.$watch('name', function () {
                $scope.count++;
            })
        }])
    </script>
</body>
</html>

(3)页面效果
执行HTML文件3-6.html,最终实现的页面效果如图3-6所示。
(4)源码分析
在本示例的源码中,当在页面的控制器中编写代码时,先定义两个$scope对象的属性“name”和“count”,前者用于使用“ng-model”指令绑定文本框中的内容,后者用于记录文本框中字符内容变化的累计次数。
然后,使用作用域中的$watch方法对$scope中的“name”属性进行监视,当该属性值发生变化时,将$scope中的“count”属性值累加1,所以,只要在文本输入框中做任何一次的修改,都会通过“count”属性值反馈至页面中。

之所以可以通过$watch方法监控模型数据发生的变化,主要是因为在Angular的内部,每当我们对已绑定“ng-model”指令的“name”属性进行修改时,其内部的$digest方法就会自动运行一次,检测已绑定的“name”属性是否与上一次$digest方法运行时获取的内容一致。如果不一致,则执行$watch方法绑定的处理函数,即将“count”属性值累加1。

3.3.2 作为数据模型的作用域

在前面的章节中我们曾说过,作用域是控制器与视图的桥梁。不仅如此,它也是视图和指令的桥梁。因为在自定义指令时,会调用$watch方法监听各个表达式的变化,一旦作用域中的表达式发生了变化,$watch方法将通知指令,而指令将根据这个变化重新渲染DOM页面,即更新作用域中的属性值内容。
无论是指令,还是控制器,它们都可以通过作用域与视图中的DOM绑定。由此,诞生了两个数据关系链,一条是:指令——>作用域——>视图;另一条是:控制器——>作用域——>视图。这两条关系链之间还是相互独立的。
接下来,通过一个简单的示例来介绍控制器借助作用域控制视图中元素的显示内容。
示例3-7 作为数据模型的作用域
(1)功能描述
当在页面的文本框中输入内容时,

元素通过双花括号绑定的方式自动同步该内容,并将它显示在
元素中。
(2)实现代码
新建一个HTML文件3-7.html,加入如代码清单3-7所示的代码。
代码清单3-7 作为数据模型的作用域

<!doctype html>
<html ng-app="a3_7">
<head>
    <title>作为数据模型的作用域</title>
    <script src="../Script/angular.min.js"
            type="text/javascript"></script>
    <style type="text/css">
        body {
            font-size: 12px;
        }
        div{
            margin:8px 0px;
        }
    </style>
</head>
<body>
    <div ng-controller="c3_7">
        <div><input type="text"
               ng-model="name" placeholder="请输入姓名"/>
        </div>
        <div>{{name}}</div>
    </div>
    <script type="text/javascript">
        var a3_7 = angular.module('a3_7', []);
        a3_7.controller('c3_7', ['$scope', function ($scope) {
            $scope.name = '';
        }])
    </script>
</body>
</html>

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

(4)源码分析
在上述示例的源代码中,先通过页面模块定义了一个名为“c3_7”的控制器,在控制器中引用$scope对象注册了一个名为“name”的属性,而$scope对象则通过注册的属性,控制了页面所需的数据模型,视图模板则通过双向绑定的方式传递并显示数据模型中的属性值。
接下来,分别从控制器和视图这两个角度来分析这个示例的具体流程。从控制器的角度来说,首先,通过$scope对象为“name”属性赋初始值;然后,通过$watch方法通知视图中的文本输入框元素数据已发生了变化,而文本框元素使用“ng-model”指令实现了数据的双向绑定。因此,它可以获悉该变化,并自动同步变化后的“name”属性值,且该值渲染至文本框中。
从视图的角度来说,由于文本框通过“ng-model”指令进行了数据的双向绑定,因此,先通过$scope对象获取控制器中“name”属性值;然后,如果用户在文本框中输入了新的内容,则会自动将该内容传递给控制器中的“name”属性,保持两端的数据同步。
此外,在

元素中使用双花括号的方式绑定“name”属性,该方式分为取值和计算两个阶段,在取值时,双花括号中的表达式将会根据$scope对象寻找所属的控制器,并在控制器中找到添加的“name”属性;取值后,在控制器中进行计算,并将结果返给$scope对象,视图模板中通过$scope获取最终值并进行渲染,最终显示在页面的
元素中。

时间: 2025-01-19 04:59:35

《AngularJS实战》——3.3 作用域概述的相关文章

《AngularJS实战》——导读

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

详解JavaScript的AngularJS框架中的作用域与数据绑定_AngularJS

AngularJS 简介AngularJS 是由 Google 发起的一款开源的前端 MVC 脚本框架,既适合做普通 WEB 应用也可以做 SPA(单页面应用,所有的用户操作都在一个页面中完成).与同为 MVC 框架的 Dojo 的定位不同,AngularJS 在功能上更加轻量,而相比于 jQuery,AngularJS 又帮您省去了许多机械的绑定工作.在一些对开发速度要求高,功能模块不需要太丰富的非企业级 WEB 应用上,AngularJS 是一个非常好的选择.AngularJS 最为复杂同时

【AngularJS】—— 12 独立作用域

独立作用域的作用 为了便于理解,先看一下下面这个例子: <!doctype html> <html ng-app="myApp"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script src="http://apps.bdimg.com/libs/angular.js

《AngularJS实战》——3.4 作用域的层级和事件

3.4 作用域的层级和事件 与页面中DOM模型相似,作用域在绑定页面元素后,便依据元素的层次关系形成了自身的层级关系,而在这些层级关系中,它们还可以通过事件的传播进行数据的通信,只是这种通过事件的数据通信应用的场景非常有限,仅限于父和子级之间的作用域,接下来我们逐一进行分析. 3.4.1 作用域的层级 与DOM树状结构类似,作用域也拥有自己的层级,并且与DOM的树状结构相辅相成,它的顶级作用域只有一个,而下面的子级作用域可以创建多个,子级作用域可以继承父级作用域中的全部属性和方法,但同级别子级作

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

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

《AngularJS实战》——1.1 Angular简介

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

详细谈谈AngularJS的子级作用域问题_AngularJS

前言 AngularJS自带指令目前有ng-include.ng-view.ng-switch.ng-repeat.这样的原因是因为,这些指令虽然是AngularJS内部定义的,但是也是和directive实现的方法都是一样的,其内部使用的是scope:true的方式,子作用域继承了父级的作用,并且构建了一个独立的子作用域,所有双向绑定实现不了,只能单独实现子级作用域继承父级的属性. AngularJS的继承是通过javascript的原型继承方式实现的,进行原型继承即意味着父作用域在子作用域的

关于angularJs指令的Scope(作用域)介绍_AngularJS

每当一个指令被创建的时候,都会有这样一个选择,是继承自己的父作用域(一般是外部的Controller提供的作用域或者根作用域($rootScope)),还是创建一个新的自己的作用域,当然AngularJS为我们指令的scope参数提供了三种选择,分别是:false,true,{}:默认情况下是false. 1.scope = false JS 代码: html 代码: result: 修改文本框的内容,两个名字都会变,实际上修改的是同一个$scope的name属性. 2. scope=true

《AngularJS实战》——3.5 本章小结

3.5 本章小结 在本章节中,先从Angular中的一个重要概念--过滤器讲起,以由浅入深的方式,通过一个个精选的.简单的.实用的.完整的案例,详细阐述了过滤器在Angular中的应用场景和使用方法: 此外,还介绍了Angular中的另一重要知识--作用域,在介绍该知识点时,采用基础理论与示例相结合的方式,逐步深入地介绍了在Angular中运用作用域开发应用的方法与技巧.通过本章的学习,既能巩固前面章节的所学知识,又可以为接下来章节的学习打下更多的实践基础.