Pour ceux qui construisent des applications complexes, sachez que votre choix aura un impact sur les performances. Par ailleurs, j'aimerais compléter la réponse de Mark par des détails techniques :
-
$timeout(callback) attendra que le cycle de digestion en cours soit terminé (c.-à-d. qu'angular mette à jour tous les modèles et le DOM), puis il exécutera son callback - affectant potentiellement le modèle angulaire - et lancera un cycle complet de $apply
sur la racine $scope, et redigérer le tout.
-
$evalAsync(callback) en revanche, ajoutera le rappel au cycle de digestion en cours ou suivant. Ce qui signifie que si vous êtes dans un cycle de digestion (par exemple dans une fonction appelée à partir d'une fonction ng-click
), cela n'attendra rien, le code sera exécuté immédiatement. Si vous êtes dans un appel asynchrone, par exemple une commande setTimeout
, un nouveau cycle de digestion ( $apply
) sera déclenché.
En termes de performances, il est donc toujours préférable d'appeler $evalAsync
La vue doit être mise à jour avant l'exécution du code, 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 de l'élément ou d'autres éléments similaires.
Si vous voulez plus de détails sur la distinction entre $timeout, $evalAsync, $digest, $apply, je vous invite à lire ma réponse à cette autre question : https://stackoverflow.com/a/23102223/1501926
Veillez également à lire le la documentation :
L'option $evalAsync ne garantit pas le moment où l'expression sera exécutée, mais seulement qu'elle le sera :
- elle s'exécutera après la fonction qui a programmé l'évaluation (de préférence avant le rendu du DOM).
- au moins un cycle $digest sera effectué après l'exécution de l'expression.
Remarque : si cette fonction est appelée en dehors d'un cycle $digest, un nouveau cycle $digest sera programmé . Cependant, il est recommandé de toujours appeler le code qui modifie le modèle à partir d'un appel à $apply. Cela inclut le code évalué via $evalAsync.