父控制器与子控制器
angularjs控制器的作用域类似于JS中函数的作用域,最大的区别在于子控制器里面的基本类型数据(string,number等)不能修改父控制器内的数据,
却可以修改父控制器中的引用类型数据(对象,数组等),先看一个例子:
父控制器为普通数据类型时的情况:
<body > <div ng-controller="father"> 父控制器名字:{{name}} <h3>子控制器1:</h3> <div class="row1" ng-controller="son1"> 子控制器1名字:{{name}} <button ng-click="change()">改名字</button> </div> <h3>子控制器2:</h3> <div class="row2" ng-controller="son2"> 子控制器2名字:{{name}} </div> </div> <script> angular.module("main",[]) .controller("father",["$scope",function($scope){ $scope.name="张三" }]) .controller("son1",["$scope",function($scope){ $scope.change=function(){ $scope.name="新名字"; } }]) .controller("son2",["$scope",function($scope){ }]) </script>
页面刚打开是这样:
当我们点击按钮之后:
我们发现只有子控制器数据发生改变,说明子控制器可以获取到父控制器的数据,但是不能修改
当父控制器为引用类型数据时:
我们把上面的例子稍微修改一下:
<body > <div ng-controller="father"> 父控制器名字:{{data.name}} <h3>子控制器1:</h3> <div class="row1" ng-controller="son1"> 子控制器1名字:{{data.name}} <button ng-click="change()">改名字</button> </div> <h3>子控制器2:</h3> <div class="row2" ng-controller="son2"> 子控制器2名字:{{data.name}} </div> </div> <script> angular.module("main",[]) .controller("father",["$scope",function($scope){ $scope.data={}//在父控制器添加一个对象 $scope.data.name="张三" }]) .controller("son1",["$scope",function($scope){ $scope.change=function(){ $scope.data.name="新名字"; } }]) .controller("son2",["$scope",function($scope){ }]) </script> </body>
看下结果:
点击改名字:
我们发现这三个控制器引用的都是一个对象!任何子控制器中修改的数据都是在同个对象上修改的,接下来看看更有意思的事情
利用factory实现兄弟控制器之间共享数据
我们知道angularjs中的factory服务可以实现数据共享,就像下面这样:
<body ng-app="main"> <h3>控制器1:</h3> <p ng-controller="son1"> 子1数据:{{name | json}} </p> <h3>控制器2:</h3> <p ng-controller="son2"> 子2数据:{{age | json}} </p> <script> angular.module("main",[]) .controller("son1",["$scope","$myserver",function($scope,$myserver){ $scope.name=$myserver.name;//张三 }]) .controller("son2",["$scope","$myserver",function($scope,$myserver){ $scope.age=$myserver.age;//55 }]) .factory("$myserver",function(){ return{ name:"张三", age:55 } }) </script> </body>
我们可以利用让兄弟控制器共同引用一块内存的原理,实现跨控制器数据共享,把代码改成这样:
<body ng-app="main"> <div ng-controller="fatherCtrl"> <h3>控制器1:</h3> <p ng-controller="son1"> 子1数据:{{data | json}} <br/> 用户名: <input type="text" ng-model="data.uname"><br/> 城市: <select ng-model="data.city" name="city"> <option>北京</option> <option>天津</option> <option>河北</option> </select> </p> <h3>控制器2:</h3> <p ng-controller="son2"> 子2数据:{{data | json}} <br/> 用户名: <input type="text" ng-model="data.uname"><br/> 城市: <select ng-model="data.city" name="city"> <option>北京</option> <option>天津</option> <option>河北</option> </select> </p> </div> <script> angular.module("main",[]) .controller("fatherCtrl",["$scope",function($scope){ }]) .controller("son1",["$scope","$myserver",function($scope,$myserver){ $scope.data=$myserver;//控制器1里面的data和控制器2里面的data指向同一块内存,所以数据是同步的 $scope.$watch("data",function(){ console.log($myserver); },true) }]) .controller("son2",["$scope","$myserver",function($scope,$myserver){ $scope.data=$myserver }]) .factory("$myserver",function(){ return{ name:"张三" } }) </script> </body>
这样,我们不管修改的哪个控制器的内容,两个兄弟控制器中的数据都是同步的