控制器在AngularJS中的作用是增强视图,用来向视图的作用域中添加额外的功能。我们用它来给作用域对象设置初始状态,并添加自定义行为。当我们在页面上创建一个新的控制器时,AngularJs会生成并传递一个新的$scope给这个控制器。可以在这个控制器里初始化$scope,由于AngularJs会负责处理控制器的实例化过程,我们只需编写构造函数即可。
控制器可以将与一个独立视图相关的业务逻辑封装在一个独立的容器中,尽可能地精简控制器是很好的做法。
AngularJS同其他Javascript框架最主要的一个区别是,控制器并不适合用来执行DOM操作,格式化或数据操作,以及除存储数据模型之外的状态维护操作。它只是视图和$scope之间的桥梁。
AngularJS通过作用域将视图,控制器和指令隔离开来,这样就很容易为功能的具体部分编写测试。
控制器嵌套(作用域包含作用域)
AnjularJS应用的任何一个部分,无论它渲染在哪个上下文中,都有父级作用域存在,对于ng-app所处的层级来讲,它的父级作用域就是$rootScope。
除了孤立作用域外,所有的作用域都通过原型继承而来,也就是说他们都可以访问父级作用域。
AnjularJS在当前作用域中无法找到某个属性时,便会在父级作用域中进行查找。如果AnjularJS找不到对应的属性,会顺着父级作用域一直向上寻找,直到抵达$rootScope为止。
控制器应该尽可能保持短小精悍,而在控制器中进行DOM操作和数据操作则是一个不好的实践。设计良好的应用会将复杂的逻辑放到指令和服务中。通过使用指令和服务,我们可以将控制器重构成一个轻量且更易于维护的形式。