switch javascript angularjs

javascript - switch - ng-model



¿Cuál es el ciclo de vida de un controlador AngularJS? (1)

¿Puede alguien aclarar cuál es el ciclo de vida de un controlador AngularJS?

  • ¿Es un controlador un singleton, o creado / destruido a pedido?
  • Si esto último, ¿qué desencadena la creación / destrucción del controlador?

Considere el siguiente ejemplo:

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}); });

p.ej:

En el ejemplo anterior, cuando navego a /users/1 , el usuario 1 se carga y se establece en $scope .

Luego, cuando navego a /users/2 , se carga el usuario 2. ¿ UserEditorCtrl reutiliza la misma instancia de UserEditorCtrl o se crea una nueva instancia?

  • Si es una nueva instancia, ¿qué desencadena la destrucción de la primera instancia?
  • Si se reutiliza, ¿cómo funciona esto? (es decir, el método para cargar los datos parece ejecutarse en la creación del controlador)

Bueno, en realidad la pregunta es cuál es el ciclo de vida de un controlador ngView .

Los controladores no son singletons. Cualquiera puede crear un nuevo controlador y nunca se destruyen automáticamente. El hecho es que generalmente está ligado al ciclo de vida de su alcance subyacente. El controlador no se destruye automáticamente cada vez que se destruye su alcance. Sin embargo, después de destruir un alcance subyacente, su controlador es inútil (al menos, por diseño, debería serlo).

Respondiendo a su pregunta específica, una directiva ngView (también para la directiva ngController ) siempre creará un nuevo controlador y un nuevo ámbito cada vez que se ngController una navegación. Y el último alcance también será destruido .

Los "eventos" del ciclo de vida son bastante simples. Su "evento de creación" es la construcción de su propio controlador. Sólo ejecuta tu código. Para saber cuándo se vuelve inútil ( "evento de destrucción" ), escuche el evento scope $destroy :

$scope.$on(''$destroy'', function iVeBeenDismissed() { // say goodbye to your controller here // release resources, cancel request... })

ngView para ngView , puede saber cuándo se carga el contenido a través del evento de alcance $viewContentLoaded :

$scope.$on(''$viewContentLoaded'', function readyToTrick() { // say hello to your new content here // BUT NEVER TOUCHES THE DOM FROM A CONTROLLER });

Aquí hay un Plunker con una prueba de concepto (abre la ventana de tu consola).