AngularJS控制器的生命周期是怎样的?

2022-08-30 01:22:47

有人可以澄清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});
});

例如:

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

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

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

答案 1

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

控制器不是单例。任何人都可以创建一个新的控制器,并且它们永远不会被自动销毁。事实是,它通常绑定到其基础范围的生命周期。每当控制器的作用域被销毁时,控制器不会自动销毁。但是,在销毁底层作用域后,其控制器是无用的(至少根据设计,它应该是无用的)。

回答您的特定问题,每次导航发生时,指令(以及指令)将始终创建新的控制器和新范围最后一个范围也将被摧毁ngViewngController

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

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

具体来说,您可以知道何时通过 scope 事件加载内容:ngView$viewContentLoaded

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

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


答案 2