Page 100 - AngularJS权威教程
P. 100

80  第 10 章  指令详解


                             <div>
                         </div>
                     </div>
                 </div>
                 在线示例:http://jsbin.com/ITEBAF/1/edit。
                 现在,我们已经理解了指令的外部作用域和继承作用域是如何工作的,下面介绍最后一个和
             作用域相关的难题:隔离作用域。


             10.2.2  隔离作用域

                 隔离作用域可能是scope属性三个选项中最难理解的一个,但也是最强大的。隔离作用域的
             概念是以面向对象编程为基础的。AngularJS指令的作用域中可以看到如Small Talk语言和SOLID
             原则的影子。
                 具有隔离作用域的指令最主要的使用场景是创建可复用的组件,组件可以在未知上下文中使
             用,并且可以避免污染所处的外部作用域或不经意地污染内部作用域。

                 创建具有隔离作用域的指令需要将scope属性设置为一个空对象{}。如果这样做了,指令的
             模板就无法访问外部作用域了:

                 <div ng-controller='MainController'>
                     Outside myDirective: {{ myProperty }}
                     <div my-directive ng-init="myProperty = 'wow, this is cool'">
                         Inside myDirective: {{ myProperty }}
                     </div>
                 </div>

                 angular.module('myApp', [])
                 .controller('MainController', function($scope) {
                 })
                 .directive('myDirective', function() {
                     return {
                         restrict: 'A',
                         scope: {},
                         priority: 100,
                         template: '<div>Inside myDirective {{ myProperty }}</div>'
                     };
                 });
                     注意,这里为myDirective设置了一个高优先级。由于ngInit指令会以非零的优先
                 级运行,这个例子将会优先运行ngInit指令,然后才是我们定义的指定,并且这个
                 myProperty在$scope对象中是有效的。

                 在线示例:http://jsbin.com/eguDEpa/1/edit。
                 示例代码的效果与将scope设置为true几乎是相同的。下面看一下使用继承作用域的指令的
             例子,对比一下二者:

                 <div ng-init="myProperty='wow,thisiscool'">
                     Surrounding scope: {{ myProperty }}
                     <div my-inherit-scope-directive></div>
                     <div my-directive></div>
                 </div>
   95   96   97   98   99   100   101   102   103   104   105