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
重复使用同一个实例,还是创建了一个新实例?
- 如果是新实例,是什么触发了第一个实例的销毁?
- 如果它被重复使用,它是如何工作的?(即,加载数据的方法似乎在创建控制器时运行)
-
好吧,实际上问题是
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 });
这是一个带有概念证明的 Plunker(打开你的控制台窗口)。