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

IT技术 javascript angularjs
2021-01-27 07:56:00

有人可以澄清一下 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重用了同一个实例,还是创建了一个新实例?

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

嗯,实际上问题是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(打开您的控制台窗口)。

如今,破坏 $scope 的代码位于github.com/angular/angular.js/blob/...很有帮助,谢谢!
2021-03-27 07:56:00
viewContentLoaded 仅在您使用超时时才有效,因为它在模板加载之前被调度......文档相反,template: "HTML STRING"但当它是一个模板文件时,它们指的是原始文件,它像异步加载一样。
2021-03-27 07:56:00