J'utilise AngularJS depuis un petit moment maintenant et j'ai trouvé le besoin d'utiliser $ timeout de temps en temps (il semble généralement que ce soit pour lancer un plugin jQuery).
Récemment, j'ai essayé d'obtenir une compréhension meilleure et plus approfondie du cycle de digestion, et je suis tombé sur la fonction $ evalAsync .
Il semble que cette fonction produit des résultats similaires à $timeout
, mais vous ne lui donnez pas de retard. Chaque fois que je l'ai utilisé, $timeout
c'était avec un retard de 0, alors maintenant je me demande si j'aurais dû l'utiliser à la $evalAsync
place.
Y a-t-il des différences fondamentales entre les deux? Quels cas utiliseriez-vous l'un sur l'autre? J'aimerais avoir une meilleure idée de quand utiliser lequel.
la source
Pour ceux qui créent des applications complexes, sachez que votre choix a un impact sur les performances. Je voudrais également compléter la réponse de Mark avec plus de détails techniques:
$ timeout (rappel) attendra que le cycle de digest en cours soit terminé (ie mise à jour angulaire de tout le modèle et du DOM), puis il exécutera son callback - affectant potentiellement le modèle angulaire - puis lancera un full
$apply
sur la racine $ scope, et redigest tout.$ evalAsync (callback) , d'autre part, ajoutera le rappel au cycle de résumé actuel ou suivant. Ce qui signifie que si vous êtes dans un cycle de digest (par exemple dans une fonction appelée à partir d'une
ng-click
directive), cela n'attendra rien, le code sera exécuté tout de suite. Si vous êtes dans un appel asynchrone, par exemple asetTimeout
, un nouveau cycle de résumé ($apply
) sera déclenché.Donc, en termes de performances, il est toujours préférable d'appeler
$evalAsync
, sauf s'il est important pour vous que la vue soit à jour avant d'exécuter votre code, par exemple si vous avez besoin d'accéder à un attribut DOm tel que la largeur des éléments, etc.Si vous souhaitez plus de détails sur la distinction entre $ timeout, $ evalAsync, $ digest, $ apply, je vous invite à lire ma réponse sur cette autre question: https://stackoverflow.com/a/23102223/1501926
Assurez-vous également de lire la documentation :
la source
x
directement depuis votre scope plutôt que depuis le DOM, pour ne pas avoir à attendre quoi que ce soit. En outre, vous devriez mieux utiliserng-style
avec css plutôt qu'avec lawidth
propriété obsolète . Si vous avez besoin d'aide supplémentaire, veuillez ouvrir une nouvelle question sur StackOverflow.