Який життєвий цикл контролера 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
На сьогоднішній день код, що знищує область $, живе за адресою github.com/angular/angular.js/blob/… . Дуже корисно, дякую!
w00t

4
viewContentLoaded працює лише в тому випадку, якщо ви використовуєте тайм-аут, тому що він надсилається безпосередньо перед завантаженням шаблону ... документи говорять про зворотне, але вони переглядаються на сировину, template: "HTML STRING"коли файл файлу шаблона завантажується як асинхронний.
користувач3338098
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.