Cuando cargo una vista, me gustaría ejecutar algún código de inicialización en su controlador asociado.
Para hacerlo, he usado la directiva ng-init en el elemento principal de mi vista:
<div ng-init="init()">
blah
</div>
y en el controlador:
$scope.init = function () {
if ($routeParams.Id) {
//get an existing object
});
} else {
//create a new object
}
$scope.isSaving = false;
}
Primera pregunta: ¿es esta la forma correcta de hacerlo?
A continuación, tengo un problema con la secuencia de eventos que tienen lugar. En la vista tengo un botón 'guardar', que usa la ng-disabled
directiva como tal:
<button ng-click="save()" ng-disabled="isClean()">Save</button>
la isClean()
función está definida en el controlador:
$scope.isClean = function () {
return $scope.hasChanges() && !$scope.isSaving;
}
Como puede ver, usa la $scope.isSaving
bandera, que se inicializó en la init()
función.
PROBLEMA: cuando se carga la vista, se llama a la función isClean antes que a la init()
función, por lo que la bandera isSaving
es undefined
. ¿Qué puedo hacer para evitarlo?
Desde AngularJS 1.5 deberíamos usar el
$onInit
que esté disponible en cualquier componente de AngularJS. Tomado de la documentación del ciclo de vida del componente desde v1.5 es la forma preferida:>> Demostración de violín
Un ejemplo avanzado del uso del ciclo de vida de los componentes:
El ciclo de vida de los componentes nos da la capacidad de manejar las cosas de los componentes de una buena manera. Nos permite crear eventos para, por ejemplo, "init", "cambiar" o "destruir" un componente. De esa manera, podemos administrar cosas que dependen del ciclo de vida de un componente. Este pequeño ejemplo muestra cómo registrar y anular el registro de un
$rootScope
detector de eventos$on
. Al saber, que un evento$on
binded en$rootScope
no será undinded cuando el controlador pierde su referencia en la vista o ser destruido tenemos que destruir un$rootScope.$on
oyente de forma manual. Un buen lugar para poner esas cosas es$onDestroy
la función de ciclo de vida de un componente:>> Demostración de violín
fuente
O simplemente puede inicializar en línea en el controlador. Si utiliza una función de inicio interna al controlador, no es necesario definirla en el alcance. De hecho, puede ser autoejecutable:
fuente
Utilizo la siguiente plantilla en mis proyectos:
fuente