AngularJS控制器的生命周期是多少?

发布于 2021-02-01 10:31:33

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

  • 如果是新实例,什么触发了第一个实例的销毁?
  • 如果重复使用,它如何工作?(即,加载数据的方法似乎在创建控制器时运行)
关注者
0
被浏览
62
1 个回答
  • 面试哥
    面试哥 2021-02-01
    为面试而生,有面试问题,就找面试哥。

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



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看