Page 38 - AngularJS权威教程
P. 38

18  第 5 章  控制器


                 正如看到的这样, $scope对象用来从数据模型向视图传递信息。同时,它也可以用来设置事
             件监听器,同应用的其他部分进行交互,以及创建与应用相关的特定业务逻辑。
                 AngularJS通过作用域将视图、控制器和指令(本书后面会介绍)隔离开来,这样就很容易
             为功能的具体部分编写测试。


             5.1  控制器嵌套(作用域包含作用域)


                 AngularJS应用的任何一个部分,无论它渲染在哪个上下文中,都有父级作用域存在。对于
             ng-app所处的层级来讲,它的父级作用域就是$rootScope。



                         有一个例外:在指令内部创建的作用域被称作孤立作用域。


                 除了孤立作用域外,所有的作用域都通过原型继承而来,也就是说它们都可以访问父级作用
             域。如果熟悉面向对象编程,对这个机制应该不会陌生。

                 默认情况下,AngularJS在当前作用域中无法找到某个属性时,便会在父级作用域中进行查
             找。如果AngularJS找不到对应的属性,会顺着父级作用域一直向上寻找,直到抵达$rootScope
             为止。如果在$rootScope中也找不到,程序会继续运行,但视图无法更新。
                 通过例子来看一下这个行为。创建一个ParentController,其中包含一个user对象,再创
             建一个ChildController来引用这个对象:

                 app.controller('ParentController', function($scope) {
                   $scope.person = {greeted: false};
                 });

                 app.controller('ChildController', function($scope) {
                   $scope.sayHello = function() {
                     $scope.person.name = 'Ari Lerner';
                   };
                 });
                 如果我们将ChildController置于ParentController内部,那ChildController的$scope
             对象的父级作用域就是ParentController的$scope对象。根据原型继承的机制,我们可以在子
             作用域中访问ParentController的$scope对象。
                 例如,我们可以在ChildController的DOM元素中访问定义在ParentController中的
             person对象,如图5-2所示。

                 <div ng-controller="ParentController">
                   <div ng-controller="ChildController">
                     <a ng-click="sayHello()">Say hello</a>
                   </div>
                   {{ person }}
                 </div>

                 控制器的这种嵌套结构和DOM的嵌套结构很相似。
                 我们看到,点击按钮时,可以在ChildController中访问ParentController中$scope.person的
   33   34   35   36   37   38   39   40   41   42   43