AngularJS 控制器 Live Dom
控制器的作用是在$scope对象上创建属性和方法,控制器的作用域是$scope,所以作用域是针对控制器来讲的。另外,控制器实例不是单例,每次都会重新实例化,不像服务是单例的。
其是注册在模块上的,如
angular.module('com.ngnice.app').controller('UserListCtrl', function($scope){});
即在模块com.ngnice.app上以名字UserListCtrl注册一个函数function,以便需要时候可以找到它。通常我们用在路由或指令中。
$stateProvider.state('user.list',{
url:'/list',
templateUrl:'views/user/list.html',
controller:'UserListCtrl'
});
当用户访问/user/list这个URL的时候,angular-ui-router插件就会实例化一个名为UserListCtrl的控制器,同时创建一个$scope对象,这个控制器实例会在$scope对象上创建属性和方法等,这个过程称为“初始化Scope对象”,之后,加载模板,并把$scope对象传入,模板中会通过指令绑定这些属性和方法,并通过一个摘要循环(digest cycle)的过程,自动维护scope变量 和视图中的DOM节点的一致性,这个时候DOM称为“活DOM(Live DOM)”.
指令中使用控制器也一样,也会创建一个$scope,知道控制器,并初始化$scope,最后把scope绑定到视图,把生成的Live DOM渲染出来。
Live DOM:即把静态的DOM和$scope绑定在一起,此过程被称为编译(complie),$compile函数是它们绑定在一起的关键。如
$compile('<ul><li ng-repeat=.....></li></ul>')(subScope);
注意:
控制器永远都不应该去操作DOM,或是持有DOM选择器,那是我们需要使用指令和ng-model的地方。同样的,业务逻辑应该存在于服务中,而非控制器。
另外,注入服务的方式,可以是显示或隐式方式
angular.module('com.ngnice.app').controller('UserListCtrl', function($scope){});隐式方式,必须制定$scope,不能少了$
angular.module('com.ngnice.app').controller('UserListCtrl', ['$scope',function(scopeObject){}]);显式方式,必须制定$scope,scopeObject相当于形参,可以任意制定。
而且可知,$scope也是个注入的服务,是单例,而scopeObject是创建的对象。