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

Mar*_*itt 199 javascript 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});
});
Run Code Online (Sandbox Code Playgroud)

例如:

在上面的示例中,当我导航到时/users/1,加载了用户1,并将其设置为$scope.

然后,当我导航到时/users/2,加载用户2.是UserEditorCtrl重用的相同实例,还是创建了新实例?

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

Cai*_*nha 223

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

控制器不是单身人士.任何人都可以创建一个新的控制器,它们永远不会被自动销毁.事实是,它通常与其基础范围的生命周期有关.只要其范围被销毁,控制器就不会自动销毁.但是,在破坏基础范围之后,它的控制器是无用的(至少,设计应该如此).

在回答您的具体问题时,ngView指令(以及ngController指令)将始终每次导航发生时创建新控制器和新范围.而最后的范围将要毁灭为好.

生命周期"事件"非常简单.您的"创建事件"是控制器本身的构造.只需运行您的代码.要知道什么时候它变得无用("破坏事件"),请听范围$destroy事件:

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

对于ngView具体情况,你可以当内容被通过范围事件时加载的认识$viewContentLoaded:

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

这是一个带有概念证明的Plunker(打开你的控制台窗口).

  • 现在破坏$ scope的代码存在于https://github.com/angular/angular.js/blob/65f5e856a161e7c91b9ebde1360242dc704d0510/src/ngRoute/directive/ngView.js#L179.非常有帮助,谢谢! (10认同)
  • viewContentLoaded只有在你使用超时时才有效,因为它在加载模板之前就被调度了...文档说的相反,但它们引用了原始的`template:"HTML STRING"`当它是一个模板文件时它被加载异步喜欢. (4认同)