$scope作用域与依赖注入
一、$scope与$rootscope作用域
$scope下的数据作为该控制器下的数据moduel,只有在该控制器下才能够访问;而$rootScope则可以可以再任何有效的地方访问到,这个有效的地方指的是ng-app声明之下的地方,也就是应用angularJS的地方。
以我的理解,就是把控制器加到哪个元素下面,相当于把其下的$scope下的元素带给了这个元素及其子孙,他们就可以访问这个控制器下$scope下的数据,其他控制器则不能。
1.$scope
$scope定义的是局部作用域,也就是只有在该控制器下才能够对其中的值进行访问。
<!DOCTYPE html>
<html ng-app>
<head lang="en">
<meta charset="UTF-8">
<script src="angular.min.js"></script>
<title></title>
<script>
function Aaa($scope){
$scope.name='tong';
}
</script>
</head>
<body>
<div ng-controller="Aaa">
<p>{{name}}</p>
</div>
{{name}}
</body>
</html>
执行结果是只有第一个name显示了“tong",第二个压根没有显示;
2.$rootscope
$rootscope定义的是全局作用域,在其中定义的变量可以再任何有效的地方访问到,这个有效的地方指的是ng-app声明之下的地方,也就是应用angularJS的地方。
<!DOCTYPE html>
<html ng-app>
<head lang="en">
<meta charset="UTF-8">
<script src="angular.min.js"></script>
<title></title>
<script>
function Aaa($scope,$rootScope){
$scope.name='tong';
$rootScope.age=19;
}
</script>
</head>
<body>
<div ng-controller="Aaa">
<p>{{name}}</p>
<p>{{age}}</p>
</div>
{{age}}
</body>
</html>
执行结果是:
tong
19
19
下面我把ng-app放到<div>中,执行结果如下:
tong
19
{{age}}
3.探究作用原理
其作用域原理很像JS中作用域的原理,若本作用域中有这个变量,则直接访问,若没有,则寻找上一层,依次类推。
<!DOCTYPE html>
<html ng-app>
<head lang="en">
<meta charset="UTF-8">
<script src="angular.min.js"></script>
<title></title>
<script>
function Aaa($scope,$rootScope){
$scope.name='tong';
$rootScope.age=19;
}
function Bbb($scope){
$scope.name='feng';
}
</script>
</head>
<body>
<div ng-controller="Aaa" >
<p>{{name}}</p>
<div ng-controller="Bbb">
<p>{{name}}</p>
<p>{{age}}</p>
</div>
</div>
</body>
</html>
执行结果如下:
tong
feng
19
19
二、依赖注入
我们先来看一个小例子。
<script>
function Aaa($scope,$rootScope) {
alert(123);
$scope.name = 'tong';
}
</script>
</head>
<body>
<div ng-controller="Aaa" >
<p>{{name}}</p>
</div>
执行结果是弹出了123。这也就是说Aaa执行了一次,但是我们声明了形参$scope,$rootScope,我们并没有传入实参呀!这就是依赖注入,angularJS根据我们定义的实参,自动传入了angular.min.js文件中的$scope,$rootScope,使得函数通过依赖管理系统仅仅需要声明需要的协作对象,而不需要知道从哪里来。但是要注意的是我们一定要按照要求来写形参,让js文件知道它该传入什么参数。其中$scope,$rootScope,$timeout等等在angularJs中都叫做服务,也就是说每次定义函数时,我们只要知道需要什么服务,然后直接写入形参就可以。
随机推荐
- SQL SERVER 2012数据库:开启防火墙导致外部无法连接数据库解决办法
SQL SERVER 2012数据库:开启防火墙导致外部无法连接数据库解决办法 将以下代码存为OpenSqlServerPort.bat文件: netsh advfirewall firewall a ...
- int *a[] 与(int *)a【5】的区别
*a[5] 是指针数组 可以指向5个值 (*a)[5] 是一个指针,但这个指针只能指向包含5个元素的一维数组 a是一个数组,每个元素都是个指针. b是一个指针,指向一个数组 1.int *a[5] ...
- java中时间
格式转化 SimpleDateFormat package day1211.common; import java.sql.Date;import java.sql.Timestamp;import ...
- UVA 11235 Frequent values 线段树/RMQ
vjudge 上题目链接:UVA 11235 *******************************************************大白书上解释**************** ...
- SDJZUOJ迷宫问题
题目描述 小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程. 小明只能向上下左右四个方向移动. 输入格式 输入包含多组测试数据.输入的第一行是一个整数T,表示有T组测试数据. 每组输入的第一行 ...
- SQL 增加列
-- 判断是否存在该列 if exists(SELECT * FROM syscolumns WHERE id=object_id('@Table') and name='@COLUMN') ALTE ...
- ryu 下发流表配置
资料链接:http://ryu.readthedocs.io/en/latest/app/ofctl_rest.html 运行ryu进程: ryu-manager --ofp-tcp-listen-p ...
- Python----初次见面,请多关照!
1.计算机的最基本认识 CPU(大脑) 3GHZ + 内存(DDR4) + 主板 + 电源(心脏)+ 显示器 + 键盘 +鼠标+ 显卡 + 硬盘 80MB/s 操作系统分为: windows 家用 l ...
- c++实验5 顺序/链式队列
链式队列及循环队列 1.循环队列的实现(请采用模板类及模板函数实现) [实现提示] 同时可参见教材p65-p67页的ADT描述及算法实现及ppt)函数.类名称等可自定义,部分变量请加上学号后3位.也可 ...
- django 模型中 class Meta 内 各种属性的用法
Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.下面对此作一总结: abstract 这个属性是定义当前的模型类是不是一个抽象类.所谓抽象类是不会相应数据库表的 ...