# 模块和控制器

### 什么是Module

* 大部分应用都有⼀一个主方法(main)用来实例化、组织、启动应用。
* AngularJS应用没有主方法，而是使用模块来声明应用应该如何启动。
* 模块允许通过声明的方式来描述应用中的依赖关系，以及如何进行组装和启动

### Angular 模块

* 模块是组织业务的一个框框，在一个模块当中定义多个服务。当引入了一个模块的时候，就可以使用这个模块提供的一种或多种服务了。
* AngularJS 本身的一个默认模块叫做 ng ，它提供了 $http ， $scope等等服务
* 服务只是模块提供的多种机制中的一种，其它的还有指令（directive ），过滤器（ filter ），及其它配置信息。
* 也可以在已有的模块中新定义一个服务，也可以先新定义一个模块，然后在新模块中定义新服务。
* 服务是需要显式地的声明依赖（引入）关系的，让 ng 自动地做注入

### Module优点

* 启动过程是声明式的，更容易懂。
* 在单元测试是不需要加载全部模块的，因此这种方式有助于写单元测试。
* 可以在特定情况的测试中增加额外的模块，这些模块能更改配置，能帮助进行端对端的测试。
* 第三方代码可以作为可复用的module打包到angular中
* 模块可以以任何先后或者并行的顺序加载（因为模块的执行本身是延迟的）。

### ng-app

通过ng-app指定对应的模块应用启动

## 定义模块

* angular.module(name\[, requires], configFn);
* configFn 会在模块初始化时执行，可以在里配置模块的服务
* configFn @see angular.config()

**例子**

index.html

```markup
<div ng-app="myApps">

        <div ng-controller="firstController">
            {{name}}
        </div>

    </div>
<script src="//cdn.bootcss.com/angular.js/1.4.8/angular.js"></script>
<script type="text/javascript" src="app/index.js"></script>
```

app/index.js

```javascript
var app = angular.module('myApps',[]);

app.controller('firstController',function($scope){
    $scope.name = '张三';
});
```
