2013-04-18 68 views
188

有人可以澄清一下AngularJS控制器的生命週期是什麼?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的相同實例,還是創建了新實例?

  • 如果是新實例,是什麼觸發了第一個實例的破壞?
  • 如果它被重用,它是如何工作的? (即,加載數據的方法似乎在創建控制器時運行)

回答

212

嗯,實際上問題是控制器的生命週期是什麼。

控制器不是單身人士。任何人都可以創建一個新的控制器,並且它們不會被自動銷燬。事實是,它通常與其基礎範圍的生命週期相關聯。控制器在其範圍被破壞時不會自動銷燬。但是,在摧毀一個基礎範圍之後,其控制器是無用的(至少在設計上應該是這樣)。

回答您的具體問題,一個ngView指令(以及爲ngController指令)將始終create a new controller and a new scope每一個導航發生時。還有last scope is going to be destroyed

生命週期「事件」非常簡單。您的「創作活動」是您的控制器本身的構造。只需運行你的代碼。要知道,當它變得無用(「破壞活動」),收聽範圍$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

現在破壞$ scope的代碼存在於https://github.com/angular/angular.js/blob/65f5e856a161e7c91b9ebde1360242dc704d0510/src/ngRoute/directive/ngView.js#L179。非常有幫助,謝謝! – w00t

+2

viewContentLoaded只在你使用超時時才起作用,因爲它在模板被加載之前被分派......文檔說的相反,但是當它是一個被加載的模板文件時,它們引用原始'template:「HTML STRING」'異步。 – user3338098

相關問題