为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

慕娘9325324 2019-10-05 11:26:36

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


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

如果重复使用,它如何工作?(即,加载数据的方法似乎在创建控制器时运行)


查看完整描述

2 回答

?
POPMUISE

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


查看完整回答
反对 回复 2019-10-05
?
白衣非少年

viewContentLoaded仅在您使用超时时才有效,因为它是在模板加载之前分派的。文档说的相反,但是template: "HTML STRING"当它是异步加载的模板文件时,它们引用的是raw 。

查看完整回答
反对 回复 2019-10-05

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信