<!doctype html><html ng-app="MyModule"><head><meta charset="utf-"><link rel="stylesheet" href="../css/bootstrap.css"></head><body><div ng-controller="MyCtrl"><drink water="{{pureWater}}"></drink></div></body><script src="../js/angular.js"><script src="ScopeAt.js"></script></html>JS代码:var myModule = angular.module("MyModule", []);myModule.controller("MyCtrl", ["$scope", function($scope){$scope.pureWater="纯净水";}])myModule.directive("drink", function() {return {restrict:"AE",scope:{water:"@"},template:"<div>{{water}}</div>"}});执行的结果平淡无奇,却暗藏玄机: 
(1) HTML页面中,声明一个标签<drink></drink>,其中定义一个属性名:water 属性值:pureWater(这里的{{}}是angularjs的一种常见表达式,类似于ng-model,用于值绑定)
(2) JS文件中,首先从模块开始,然后创建一个控制器行2~行4,再定义一个指令,主要实现的是将"<drink></drink>"替换为"<div>{{water}}</div>"标签显示
(3) 重点介绍这里的
scope:{water:"@"}该表达式等价于:link:function(scope,element,attrs){scope.water=attrs.water;}具体含义就是在指令的scope上定义一个属性名:water,它的值就是前台界面中water属性的值,也就是"{{pureWater}}";
2.指令作用域中的=
作用是与父scope中的属性进行双向绑定。
<!doctype html><html ng-app="MyModule"><head><meta charset="utf-"><link rel="stylesheet" href="../css/bootstrap.css"></head><body><div ng-controller="MyCtrl">Ctrl:<br><input type="text" ng-model="pureWater"><br>Directive:<br><drink water="pureWater"></drink></div></body><script src="../js/angular.js"></script><script src="ScopeEqual.js"></script></html>var myModule = angular.module("MyModule", []);myModule.controller("MyCtrl", ["$scope", function($scope){$scope.pureWater="纯净水";}])myModule.directive("drink", function() {return {restrict:"AE",scope:{water:"="},template:"<input type="text" ng-model="water"/>"}});这里=的手段类似,通过页面设置两个输入框,分别代表指令和控制器的作用域,在JS代码实现了双向绑定,做到了控制器与指令在各自作用域内能够影响对方,也就是双向通信,具体思路与@类似,不赘述,上图:
3.指令作用域中的&
主要作用是传递一个来自父scope的函数,稍后调用。
<!doctype html><html ng-app="MyModule"><head><meta charset="utf-"><link rel="stylesheet" href="../css/bootstrap.css"></head><body><div ng-controller="MyCtrl"><greeting greet="sayHello(name)"></greeting><greeting greet="sayHello(name)"></greeting><greeting greet="sayHello(name)"></greeting></div></body><script src="../js/angular.js"></script><script src="ScopeAnd.js"></script></html>var myModule = angular.module("MyModule", []);myModule.controller("MyCtrl", ["$scope", function($scope){$scope.sayHello=function(name){alert("Hello "+name);}}])myModule.directive("greeting", function() {return {restrict:"AE",scope:{greet:"&"},template:"<input type="text" ng-model="userName" /><br/>"+"<button class="btn btn-default" ng-click="greet({name:userName})">Greeting</button><br/>"}});从页面可以看出,这里定义了一个标签<greeting></greeting>,并在其中定义了属性名greet,与上面的@以及=不同的是,属性名后面是一个方法,所以,这里的&主要用于在Controller和directive之间传递函数,实现两者之间的函数通信,在JS中,将前台的greeting标签替换为template中的内容,一个输入框加上一个按钮,按钮上绑定了greet函数,与前台页面的greet相呼应,而前台的greet函数在控制器中有定义,所以指令中也是调用的控制器中的greet函数。执行结果如下:
(2)在第一个文本框填值
(2)在第二个文本框填值
(3)在第三个文本框填值