AngularJS控制器的生命周期是什么?

有人可以澄清一下AngularJS控制器的生命周期是什么?

  • 控制器是单身人士,还是按需求创build/销毁?
  • 如果是后者,是什么触发了控制器的创build/销毁?

考虑下面的例子:

var demoApp = angular.module('demo') .config(function($routeProvider, $locationProvider) { $routeProvider .when('/home', {templateUrl: '/home.html', controller: 'HomeCtrl'}) .when('/users',{templateUrl: '/users.html', controller: 'UsersCtrl'}) .when('/users/:userId', {templateUrl: '/userEditor.html', controller: 'UserEditorCtrl'}); }); demoApp.controller('UserEditorCtrl', function($scope, $routeParams, UserResource) { $scope.user = UserResource.get({id: $routeParams.userId}); }); 

例如:

在上面的例子中,当我导航到/users/1 ,用户1被加载,并设置为$scope

然后,当我导航到/users/2 ,用户2被加载。 UserEditorCtrl实例是否被重用,或者是创build了一个新实例?

  • 如果是新实例,是什么触发了第一个实例的破坏?
  • 如果它被重用,这是如何工作的? (即,加载数据的方法似乎在创build控制器时运行)

那么,实际上问题是什么ngView控制器的生命周期。

控制器不是单身人士。 任何人都可以创build一个新的控制器,而且不会自动销毁。 事实上,它一般是绑定到其基础范围的生命周期。 控制器在其范围被破坏时不会自动销毁。 但是,在销毁基础范围之后,其控制器是无用的(至less应该是devise的)。

回答你的具体问题, ngView指令(以及ngController指令)总是会在每次导航时创build一个新的控制器和一个新的范围 。 最后一个范围也将被销毁 。

生命周期“事件”非常简单。 你的“创造事件”是你的控制器本身的构造。 只要运行你的代码。 要知道什么时候它变得无用( “销毁事件” ),请听范围$destroy事件:

 $scope.$on('$destroy', function iVeBeenDismissed() { // say goodbye to your controller here // release resources, cancel request... }) 

对于ngView ,你可以知道什么时候通过范围事件$viewContentLoaded加载内容:

 $scope.$on('$viewContentLoaded', function readyToTrick() { // say hello to your new content here // BUT NEVER TOUCHES THE DOM FROM A CONTROLLER }); 

这是一个概念certificate的打砖块 (打开你的控制台窗口)。