一、$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中都叫做服务,也就是说每次定义函数时,我们只要知道需要什么服务,然后直接写入形参就可以。

随机推荐

  1. Android-有序广播

    在之前的博客,Android-广播概念,中介绍了(广播和广播接收者)可以组件与组件之间进行通讯,有两种类型的广播(无序广播 和 有序广播),这篇博客就来讲解有序广播的代码实现: 有序广播:接收者 可以 ...

  2. 自我介绍和Github的初次体验

    姓名:袁宇鹏    学号:1413042045    班级:网络工程142    兴趣爱好:篮球,看书 写过的代码:用C++写过,只能算是看看这源程序修改. 没有开发过任何程序 Github使用流程: ...

  3. 利用SQL表生成按日期序列的唯一ID

    1. 创建一个表,用于存现在最大的ID SELECT [ID],[PreFix],[Code] FROM [DocumentNO] 2. 增加SP,利用锁表,生成相应的ID Create PROCED ...

  4. windows本地代码上传github

    1.下载Git工具 https://www.git-scm.com/download/win 2.进到项目目录 cd /dir/dir/dir/file 3.初始化 git init 4.添加远程仓库 ...

  5. 关于 Kafka offset

    查询topic的offset的范围 用下面命令可以查询到topic:Mytopic broker:SparkMaster:9092的offset的最小值: bin/kafka-run-class.sh ...

  6. C语言/C++编程学习:不做C/C++工作也要学C/C++的原因!

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  7. C语言/C++编程学习:和QT零距离接触的意义

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  8. Java实现对ftp的读写文件

    这里仅仅是对ftp工具类的简单使用,很多东西还不是很了解.当然学以致用,先用到这里吧. public class FtpTest { /** * 向ftp写文件(数据) */ @Test public ...

  9. Android学习之Adapter(数据适配器)

    1.定义     数据适配器是AdapterView视图(如ListView - 列表视图控件.Gallery - 缩略图浏览器控件.GridView - 网格控件.Spinner - 下拉列表控件. ...

  10. 深入了解java虚拟机(JVM) 第七章 内存分配策略

    理解了jvm内存分配策略不仅是程序性能调优的重要知识,还能够给养成自己一种良好的代码思路,一个程序的代码差异往往都是在这里体现出来的. 一.对象优先分配到Eden区域   一般来说,新创建的对象都会直 ...