Page 98 - AngularJS权威教程
P. 98

78  第 10 章  指令详解


                 上面的列子展示的是第一种情况。前两个div是兄弟元素,可以通过get和set访问$rootScope。
             第二个div内部的div同样可以通过get和set访问相同的根作用域。
                 指令嵌套并不一定意味着需要改变它的作用域。默认情况下,子指令会被付予访问父DOM
             元素对应的作用域的能力,这样做的原因可以通过介绍指令的scope参数来理解,scope参数默
             认是false。


             10.2.1  scope参数(布尔型或对象)

                 scope参数是可选的,可以被设置为true或一个对象。默认值是false。
                 当scope设置为true时,会从父作用域继承并创建一个新的作用域对象。

                 如果一个元素上有多个指令使用了隔离作用域,其中只有一个可以生效。只有指令模板中的
             根元素可以获得一个新的作用域。因此,对于这些对象来说scope默认被设置为true。
                 内置指令ng-controller的作用,就是从父级作用域继承并创建一个新的子作用域。它会创
             建一个新的从父作用域继承而来的子作用域。

                 用这些新内容更新一下前面的例子:

                 <div ng-app="myApp"
                     ng-init="someProperty = 'some data'">
                     <div ng-init="siblingProperty='moredata'">
                         Inside Div Two: {{ aThirdProperty }}
                         <div ng-init="aThirdProperty = 'data for 3rd property'"
                              ng-controller="SomeController">
                             Inside Div Three: {{ aThirdProperty }}
                             <div ng-init="aFourthProperty">
                                 Inside Div Four: {{ aThirdProperty }}
                             </div>
                         </div>
                     </div>
                 </div>
                 如果直接运行这段代码会报错,因为没有在JavaScript中定义所需的控制器,下面就来定义这
             个控制器:
                 angular.module('myApp', [])
                 .controller('SomeController', function($scope) {
                     // 可以留空,但需要被定义
                 })
                 刷新页面,会发现第二个div中由于{{ aTgirdProperty }}未定义,因此什么都没有输出。
             第三个div显示了设置在继承来的作用域中的data for a 3rd property,如图10-1所示。

                 为了进一步证明作用域的继承机制是向下而非向上进行的,下面再看另外一个例子,展示的
             是{{ aThirdProperty }}从父作用域继承而来:

                 <div ng-app="myApp"
                     ng-init="someProperty = 'some data'"></div>
                 <div ng-init="siblingProperty='moredata'">
                     Inside Div Two: {{ aThirdProperty }}
                     <div ng-init="aThirdProperty = 'data for 3rd property'"
                         ng-controller="SomeController">
   93   94   95   96   97   98   99   100   101   102   103