有人能澄清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的同一实例,还是创建新的实例?

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

推荐答案

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

控制器不是单例.任何人都可以创建一个新的控制器,它们永远不会被自动销毁.事实是,它通常与其潜在范围的生命周期有关.每当控制器的作用域被销毁时,控制器不会自动销毁.然而,在 destruct 了一个底层作用域之后,它的控制器就没用了(至少在设计上应该是这样).

回答您的特定问题时,每次导航发生时,ngView指令(ngController指令也是如此)始终为create a new controller and a new scope.last scope is going to be destroyed也是.

生命周期"事件"非常简单."creation event"是控制器本身的构造.只要运行你的代码.要知道它何时变得无用("destruction event"),请收听scope $destroy事件:

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

具体地说,对于ngView,您可以通过Scope事件$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和概念验证(打开控制台窗口).

Javascript相关问答推荐

使用useParams路由失败

如何使用JavaScript用等效的功能性HTML替换标记URL格式?

使用JavaScript单击上一个或下一个特定按钮创建卡滑动器以滑动单个卡

我在这个黑暗模式按钮上做错了什么?

Redux工具包查询(RTKQ)端点无效并重新验证多次触发

没有输出到带有chrome.Devtools扩展的控制台

rxjs插入延迟数据

JS:XML insertBefore插入元素

在forEach循环中获取目标而不是父对象的属性

如何将未排序的元素追加到数组的末尾?

如何在Angular拖放组件中同步数组?

扩展类型的联合被解析为基类型

当用户点击保存按钮时,如何实现任务的更改?

MarkLogic-earch.suggest不返回任何值

无法避免UV:flat的插值:非法使用保留字"

为什么当我更新数据库时,我的所有组件都重新呈现?

与svg相反;S getPointAtLength(D)-我想要getLengthAtPoint(x,y)

警告框不显示包含HTML输入字段的总和

本地损坏的Java脚本

未捕获的不变违规:即使在使用DndProvider之后也应使用拖放上下文