AngularJS 컨트롤러의 수명주기는 무엇입니까?


199

누군가 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재사용되거나 새 인스턴스가 작성됩니까?

  • 새 인스턴스 인 경우 첫 번째 인스턴스가 파괴되는 원인은 무엇입니까?
  • 재사용되는 경우 어떻게 작동합니까? (즉, 데이터를로드하는 방법은 컨트롤러 생성시 실행되는 것으로 나타남)

답변:


227

실제로 문제는 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 가 있습니다 (콘솔 창 열기).


10
요즘 $ scope를 파괴하는 코드는 github.com/angular/angular.js/blob/…에 있습니다. 매우 도움이되었습니다. 감사합니다!
w00t

4
이 템플릿이로드되기 직전에 전달됩니다 때문에 타임 아웃을 사용하는 경우에만 작동 viewContentLoaded ... 워드 프로세서 반대를 말하지만, 그들은 원료로 다스 려하는 template: "HTML STRING"그것과 같은로드 비동기를 얻을 템플릿 파일이 때.
user3338098 2016
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.