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
再利用されるのでしょうか、それとも新しいインスタンスが作成されますか?
- 新しいインスタンスの場合、最初のインスタンスの破棄をトリガーするものは何ですか?
- 再利用される場合、これはどのように機能しますか? (つまり、データをロードするメソッドは、コントローラーの作成時に実行されるようです)
ベストアンサー1
さて、実際のところ、コントローラーのライフサイクルとは何かという疑問があります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
});
プランカーです概念証明付き (コンソール ウィンドウを開きます)。