有人可以澄清一下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/1
$scope
然后,当我导航到时/users/2,将加载用户2。是相同的UserEditorCtrl重用实例,还是创建了新实例?
/users/2
UserEditorCtrl
好吧,实际上问题是ngView控制器的生命周期是多少。
ngView
控制器不是单例。任何人都可以创建一个新的控制器,并且它们永远不会被自动销毁。事实是,它通常与其基础范围的生命周期相关联。只要销毁其范围,控制器就不会自动销毁。但是,销毁基础作用域后,其控制器将无用(至少在设计上应为)。
在回答您的特定问题时,每次进行导航时,ngView指令(以及ngController指令)总是会创建一个新的控制器和一个新的作用域。而最后的范围将要毁灭为好。
ngController
生命周期“事件”非常简单。您的 “创建事件” 是控制器本身的构造。只需运行您的代码。要知道什么时候变得无用( “破坏事件” ),请监听作用域$destroy事件:
$destroy
$scope.$on('$destroy', function iVeBeenDismissed() { // say goodbye to your controller here // release resources, cancel request... })
对于ngView具体情况,你可以当内容被通过范围事件时加载的认识$viewContentLoaded:
$viewContentLoaded
$scope.$on('$viewContentLoaded', function readyToTrick() { // say hello to your new content here // BUT NEVER TOUCHES THE DOM FROM A CONTROLLER });