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

有人能解释一下AngularJS控制器的生命周期是什么吗?

  • 控制器是单例的,还是按需创建/销毁的?
  • 如果是后者,是什么触发控制器的创建/销毁?

考虑下面的例子:

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的相同实例是否被重用,还是创建了一个新实例?

  • 如果是一个新实例,是什么触发了第一个实例的销毁?
  • 如果它被重用,它是如何工作的?(即。,加载数据的方法似乎在控制器创建时运行)
81451 次浏览

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

控制器不是单例的。任何人都可以创建一个新的控制器,它们永远不会被自动销毁。事实上,它通常绑定到其底层作用域的生命周期。当控制器的作用域被销毁时,控制器不会自动销毁。然而,在破坏了底层作用域之后,它的控制器就无用了(至少在设计上应该如此)。

回答你的具体问题,ngView指令(以及ngController指令)在每次导航发生时总是创建一个新的控制器和一个新的作用域。还有最后一个瞄准镜就要被摧毁了

生命周期“事件”非常简单。你的“创建事件”是你的控制器本身的构造。只需运行代码。要知道它什么时候变得无用(“毁灭事件”),请监听作用域$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
});

这是普伦克与概念证明(打开你的控制台窗口)。