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的