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

24 浏览
0 Comments

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

有人能否请明确一下AngularJS控制器的生命周期是什么?\n

    \n

  • 控制器是单例的,还是按需创建/销毁的?
  • \n

  • 如果是后者,是什么触发了控制器的创建/销毁?
  • \n

\n考虑下面的例子:\n

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});
});

\n例如:\n在上面的例子中,当我导航到/users/1时,用户1被加载并设置到$scope中。\n然后,当我导航到/users/2时,用户2被加载。是重用相同的UserEditorCtrl实例,还是创建一个新实例?\n

    \n

  • 如果是新实例,是什么触发了第一个实例的销毁?
  • \n

  • 如果是重用,这是如何工作的?(即,加载数据的方法似乎在控制器创建时运行)
  • \n

0
0 Comments

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

事实上,问题是关于ngView控制器的生命周期是什么。

控制器不是单例。任何人都可以创建一个新的控制器,它们永远不会自动销毁。事实上,它通常与其底层作用域的生命周期绑定在一起。控制器在其作用域被销毁后不会自动销毁。然而,销毁底层作用域后,控制器将变得无用(至少根据设计应该是这样)。

回答你的具体问题,每次导航发生时,ngView指令(以及ngController指令)都会创建一个新的控制器和新的作用域。并且最后一个作用域也将被销毁

生命周期"事件"非常简单。您的“创建事件”是控制器本身的构造。只需运行您的代码。要知道何时变得无用(“销毁事件”),请监听作用域的$destroy事件:

$scope.$on('$destroy', function iVeBeenDismissed() {
  // 在这里告别你的控制器
  // 释放资源、取消请求...
})

对于特定的ngView,您可以通过作用域事件$viewContentLoaded知道内容何时加载完成:

$scope.$on('$viewContentLoaded', function readyToTrick() {
  // 在这里欢迎你的新内容
  // 但千万不要从控制器中操作DOM
});

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

现在销毁$scope的代码位于github.com/angular/angular.js/blob/…。非常有帮助,谢谢!

viewContentLoaded只有在使用timeout时才起作用,因为它在模板加载之前被分派...文档中说的是相反的,但它们是指原始的template: "HTML STRING",当它是一个模板文件时,它是异步加载的。

0