AngularJs最重要也是最难理解的模块之一就是它的指令(directive)了,自定义指令配置有不少个参数,下面我只说说其中scope的配置极其含义。javascript
scope表示指令的做用域,它有三个可选值:true、false、对象{}。java
.directive("myDirective", function(){ return { restrict: "EA", scope: true/false/{}, template: "<div>{{content}}</div>" } })
true:继承父做用域且建立独立做用域;app
false:继承父做用域;函数
{}:不继承父做用域且建立独立做用域;spa
分别是什么意思呢?看真实demo:双向绑定
源码:rest
<div ng-app="myModule"> <h3>请分别修改父、子做用域表单里的值</h3> <div ng-controller="myController"> 指令配置:scope: true <br/> 父做用域:<input type="text" ng-model="content" /><br/> 子做用域:<my-directive></my-directive><br/><br/> </div> <div ng-controller="myController2"> 指令配置:scope: false <br/> 父做用域:<input type="text" ng-model="content" /><br/> 子做用域:<my-directive2></my-directive2><br/><br/> </div> <div ng-controller="myController3"> 指令配置:scope: {} <br/> 父做用域:<input type="text" ng-model="content" /><br/> 子做用域:<my-directive3></my-directive3> </div> </div> <script type="text/javascript"> var myModule = angular.module("myModule", []); myModule.controller("myController", ['$scope', function($scope){ $scope.content = "自定义指令"; }]) myModule.controller("myController2", ['$scope', function($scope){ $scope.content = "自定义指令"; }]) myModule.controller("myController3", ['$scope', function($scope){ $scope.content = "自定义指令"; }]) myModule.directive("myDirective", function(){ return { restrict: "EA", scope: true, template: "<input type='text' ng-model='content' />" } }) myModule.directive("myDirective2", function(){ return { restrict: "EA", scope: false, template: "<input type='text' ng-model='content' />" } }) myModule.directive("myDirective3", function(){ return { restrict: "EA", scope: {}, template: "<input type='text' ng-model='content' />" } }) </script>
分别修改父域、子域里的值会发现:code
scope为true时,修改父域的值会影响到子域,修改子域不影响父域,由于子域是独立的;对象
scope为 false时,修改父域的值会影响子域,修改子域也会影响父域,是双向绑定,scope配置默认值是false;blog
scope为{}时,修改父域的值不影响子域,修改子域也不会影响父域,子域是彻底隔离的做用域;
另外,当scope为非空对象时,父域和子域能够以指定的方式传递指定的数据,这就是指令与指令之间的交互。
数据传递也分三种方式:@、=、&,先看demo:
源码:
<div ng-app="myModule"> <h3>请分别修改父、子做用域表单里的值</h3> <div ng-controller="myController"> 父做用域:<br/> <input type="text" ng-model="name" /><br/> <input type="text" ng-model="sex" /><br/> <input type="button" ng-click="say()" value="点击执行父域的say方法" /><br/> 子做用域:<br/> <my-directive my-name="{{name}}" my-sex="sex" get-name='say()'></my-directive><br/> </div> </div> <script type="text/javascript"> var myModule = angular.module("myModule", []); myModule.controller("myController", ['$scope', function($scope){ $scope.name = "wangmeijian"; $scope.sex = "boy"; $scope.say = function(){ alert( $scope.name +" is a"+ $scope.sex ) } }]) myModule.directive("myDirective", function(){ return { restrict: "EA", scope: { myName: "@", mySex: "=", getName: "&" }, template: "<input type='text' ng-model='myName' /><br/>"+ "<input type='text' ng-model='mySex' /><br/>"+ "<input type='button' ng-click='getName()' value='点击执行子域的say方法' />" } }) </script>
@:单向引用父域的值,传递的值必须是字符串且在指令里引用时必须加上{{}};
=:双向绑定子域和父域;
&:单向绑定父域,以便在其中运行函数
总结:scope是指令与指令之间交互,做用域之间数据互通的重要途径,是很经常使用也很重要的基础知识,务必要掌握。
做者:古德God
出处:http://www.cnblogs.com/wangmeijian 本文版权归做者和博客园全部,欢迎转载,转载请标明出处。 若是您以为本篇博文对您有所收获,请点击右下角的 [推荐],谢谢!