父控制器与子控制器
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>
这样,我们不管修改的哪个控制器的内容,两个兄弟控制器中的数据都是同步的
浙公网安备 33010602011771号