有人可以澄清一下AngularJS Controller 的生命周期是什么吗?

  • Controller 是单例的,还是按需创建/销毁的?
  • 如果是后者,什么触发了 Controller 的创建/销毁?

  • 考虑以下示例:
    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的同一实例,还是创建了新实例?
  • 如果是新实例,是什么触发第一个实例的销毁?
  • 如果重新使用,它如何工作? (即,加载数据的方法似乎在创建 Controller 时运行)
  • 最佳答案

    好吧,实际上问题是ngView Controller 的生命周期是多少。

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

    在回答您的特定问题时,每次导航时,ngView指令(以及ngController指令)将始终为create a new controller and a new scope。还有last scope is going to be destroyed

    生命周期“事件”非常简单。您的“创建事件” 是 Controller 本身的结构。只需运行您的代码。要知道它何时变得无用(“销毁事件” ),请侦听作用域$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
    });
    

    带有概念证明的Here is a Plunker(打开控制台窗口)。

    10-07 18:07
    查看更多