Lorsque je charge une vue, j'aimerais exécuter du code d'initialisation dans son contrôleur associé.
Pour ce faire, j'ai utilisé la directive ng-init sur l'élément principal de ma vue:
<div ng-init="init()">
blah
</div>
et dans le contrôleur:
$scope.init = function () {
if ($routeParams.Id) {
//get an existing object
});
} else {
//create a new object
}
$scope.isSaving = false;
}
Première question: est-ce la bonne façon de procéder?
Ensuite, j'ai un problème avec la séquence des événements. Dans la vue, j'ai un bouton `` enregistrer '', qui utilise la ng-disabled
directive en tant que telle:
<button ng-click="save()" ng-disabled="isClean()">Save</button>
la isClean()
fonction est définie dans le contrôleur:
$scope.isClean = function () {
return $scope.hasChanges() && !$scope.isSaving;
}
Comme vous pouvez le voir, il utilise l' $scope.isSaving
indicateur, qui a été initialisé dans la init()
fonction.
PROBLEME: lorsque la vue est chargé, la fonction isClean est appelée avant la init()
fonction, d' où le drapeau isSaving
est undefined
. Que puis-je faire pour éviter cela?
Depuis AngularJS 1.5, nous devrions utiliser
$onInit
ce qui est disponible sur n'importe quel composant AngularJS. Tiré de la documentation sur le cycle de vie des composants depuis la v1.5, c'est la méthode préférée:>> Démo Fiddle
Un exemple avancé d'utilisation du cycle de vie des composants:
Le cycle de vie des composants nous donne la possibilité de gérer correctement les composants. Cela nous permet de créer des événements pour par exemple "init", "change" ou "destroy" d'un composant. De cette façon, nous sommes en mesure de gérer des éléments qui dépendent du cycle de vie d'un composant. Ce petit exemple montre comment enregistrer et désinscrire un
$rootScope
écouteur d'événement$on
. En sachant, qu'un événement$on
binded sur$rootScope
ne sera pas undinded lorsque le contrôleur perd sa référence dans la vue ou se détruit , nous devons détruire un$rootScope.$on
auditeur manuellement. Un bon endroit pour mettre ces choses est$onDestroy
la fonction de cycle de vie d'un composant:>> Démo Fiddle
la source
Ou vous pouvez simplement initialiser en ligne dans le contrôleur. Si vous utilisez une fonction init interne au contrôleur, elle n'a pas besoin d'être définie dans la portée. En fait, il peut être auto-exécutable:
la source
J'utilise le modèle suivant dans mes projets:
la source