Vous devez être conscient du fonctionnement d'AngularJS afin de le comprendre.
Cycle de résumé et portée $
D'abord et avant tout, AngularJS définit un concept d'un soi-disant cycle de digestion . Ce cycle peut être considéré comme une boucle, au cours de laquelle AngularJS vérifie s'il y a des changements à toutes les variables surveillées par tous les $scope
s. Donc, si vous avez $scope.myVar
défini dans votre contrôleur et que cette variable a été marquée pour être surveillée , vous dites implicitement à AngularJS de surveiller les changements myVar
à chaque itération de la boucle.
Une question de suivi naturelle serait: tout est-il attaché à la $scope
surveillance? Heureusement non. Si vous surveilliez les modifications de chaque objet de votre $scope
, alors rapidement une boucle de résumé prendrait beaucoup de temps à évaluer et vous vous heurteriez rapidement à des problèmes de performances. C'est pourquoi l'équipe AngularJS nous a donné deux façons de déclarer une $scope
variable comme étant surveillée (lire ci-dessous).
$ watch aide à écouter les changements de portée de $
Il existe deux façons de déclarer une $scope
variable comme étant surveillée.
- En l'utilisant dans votre modèle via l'expression
<span>{{myVar}}</span>
- En l'ajoutant manuellement via le
$watch
service
Annonce 1) C'est le scénario le plus courant et je suis sûr que vous l'avez déjà vu, mais vous ne saviez pas que cela a créé une montre en arrière-plan. Oui, bien sûr! L'utilisation de directives AngularJS (telles que ng-repeat
) peut également créer des surveillances implicites.
Annonce 2) Voici comment créer vos propres montres . $watch
Le service vous aide à exécuter du code lorsque certaines valeurs attachées à $scope
ont changé. Il est rarement utilisé, mais est parfois utile. Par exemple, si vous souhaitez exécuter du code à chaque fois que «myVar» change, vous pouvez effectuer les opérations suivantes:
function MyController($scope) {
$scope.myVar = 1;
$scope.$watch('myVar', function() {
alert('hey, myVar has changed!');
});
$scope.buttonClicked = function() {
$scope.myVar = 2; // This will trigger $watch expression to kick in
};
}
$ apply permet d'intégrer les changements au cycle de résumé
Vous pouvez considérer la $apply
fonction comme un mécanisme d'intégration . Vous voyez, chaque fois que vous modifiez directement une variable surveillée attachée à l'$scope
objet, AngularJS saura que le changement s'est produit. En effet, AngularJS savait déjà surveiller ces changements. Donc, si cela se produit dans du code géré par le framework, le cycle de résumé se poursuivra.
Cependant, parfois vous voulez changer une valeur en dehors du monde AngularJS et voir les changements se propager normalement. Considérez ceci - vous avez une $scope.myVar
valeur qui sera modifiée dans le $.ajax()
gestionnaire d' un jQuery . Cela se produira à un moment donné à l'avenir. AngularJS ne peut pas attendre que cela se produise, car il n'a pas été invité à attendre sur jQuery.
Pour y remédier, $apply
a été introduit. Il vous permet de démarrer le cycle de digestion de manière explicite. Cependant, vous ne devez l'utiliser que pour migrer certaines données vers AngularJS (intégration avec d'autres frameworks), mais ne jamais utiliser cette méthode combinée avec du code AngularJS normal, car AngularJS lèvera alors une erreur.
Comment tout cela est-il lié au DOM?
Eh bien, vous devriez vraiment suivre à nouveau le tutoriel, maintenant que vous savez tout cela. Le cycle de résumé s'assurera que l'interface utilisateur et le code JavaScript restent synchronisés, en évaluant chaque observateur attaché à tous les $scope
s tant que rien ne change. Si plus aucun changement ne se produit dans la boucle de résumé, alors il est considéré comme terminé.
Vous pouvez attacher des objets à l' $scope
objet soit explicitement dans le Controller, soit en les déclarant sous {{expression}}
forme directement dans la vue.
J'espère que cela aide à clarifier certaines connaissances de base sur tout cela.
Lectures complémentaires: