模块
在angularJS中,模块是定义应用的最主要方式。模块包含了主要的应用代码。一个应用可以包含多个模块,每一个模块都包含了定义具体功能的代码。使用模块能带给我们许多好处,例如:
- 保持全局命名空间的清洁
- 编写测试代码更容易,并能保持其清洁,以便更容易找到互相隔离的功能
- 易于在不同的应用间复用代码
- 使应用能够以任意顺序加载代码的各个部分
angularJS允许我们使用angular.module()方法来声明模块,这个方法能接受两个参数,第一个是模块名称,第二个是依赖列表,也就是可以被注入到模块中的对象列表。使用方法如下:
angular.module()的参数列表如下:
参数 | 类型 | 介绍 |
---|---|---|
name | 字符串 | name是模块的名称,字符串变量 |
requires | 字符串 | requires包含了一个字符串变量组成的列表,每个元素都是一个模块名称,本模块依赖于这些模块,依赖需要在本模块加载之前由注入器进行预加载 |
作用域
作用域是构成angularJS应用的核心基础,在整个框架中都被广泛应用。
应用的作用域是和应用的数据模型相关联的,同时作用域也是表达式执行的上下文。$scope对象是定义应用业务逻辑、控制器方法和视图属性的地方。
作用域是视图和控制器之前的胶水。在应用将视图渲染并呈现给用户之前,视图中的模板会和作用域进行连接,然后应用会对DOM进行设置以便将属性的变化通知给angularJS。这个功能让XHR请求等promise对象的实现变得非常容易。
将应用的业务逻辑都放在控制器中,而将相关的数据都放在控制的作用域中,这是非常完美的架构。
- 视图和$scope的世界
angularJS启动并生成视图时,会将根ng-app元素同$rootScope进行绑定。$rootScope是所有$scope对象的最上层。
$scope对象就是一个普通的javascript对象,我们可以在其上随意修改或添加属性。$scope并不负责处理和操作数据,它只是视图和html之间的桥梁,它是视图和控制器之前的胶水。我们可以在angularJS应用的模板中使用多种标记,包括下面这些:
- 指令: 将DOM元素增强为可复用的 DOM组件的属性或元素
- 值绑定: 模板语法可以将表达式绑定到视图上
- 过滤器: 可以在视图中使用函数,用来进行格式化
- 表单控件: 用来检验用户输入的控件
- 作用域能做什么
作用域有一下功能
- 提供观察者以监视数据模型的变化
- 可以将数据模型的变化通知给整个应用,甚至是系统外的组件
- 可以进行嵌套,隔离业务功能和数据
- 给表达式提供运算时所需要的执行环境
我们可以创建一个控制器来管理与其相关的变量,而不是将name变量直接放在$rootScope上
- $scope的生命周期
$scope对象的生命周期有四个不同的阶段。
- 创建。在创建控制器指令时,angularJS会用$injector创建一个新的作用域,并在这个新的控制器或指令运行时将作用域传过去。
- 链接。当angularJS开始运行时,所有的$scope对象都会附加或者链接到视图中。所有创建$scope对象的函数也会将自身附加到视图中。这些作用域将会注册当angularJS应用上下文中发生变化时需要运行的函数。这些函数被称称为$watch函数, Angular通过这些函数获知何时启动事件循环。
- 更新。当事件循环运行时,它通常执行在顶层$scope对象上(被称作$rootScope),每个子作用域都执行自己的脏值检测。每个监控函数都会检查变化。如果检测到任意变化, $scope对象就会触发指定的回调函数。
- 销毁。当一个scope在视图中不再需要时,这个作用域将会清理和销毁自己。尽管永远不会需要清理作用域(因为Angular会为你处理),但是知道是谁创建了这个作用域还是有用的,因为你可以使用这个$scope上叫做$destory()的方法来清理这个作用域。
- 指令和作用域
指令在AngularJS中被广泛使用,指令通常不会创建自己的$scope,但也有例外。比如ng-controller和ng-repeat指令会创建自己的子作用域并将它们附加到DOM元素上。