Para aquellos que crean aplicaciones complejas, tenga en cuenta que hay un impacto en el rendimiento de su elección. Además, me gustaría completar la respuesta de Mark con más detalles técnicos:
$ timeout (devolución de llamada) esperará a que se realice el ciclo de resumen actual (es decir, actualización angular de todos los modelos y DOM), luego ejecutará su devolución de llamada, que posiblemente afecte al modelo angular, y luego lanzará un completo $apply
en la raíz $ alcance y redirigirá todo.
$ evalAsync (devolución de llamada) , por otro lado, agregará la devolución de llamada al ciclo de resumen actual o siguiente. Lo que significa que si está dentro de un ciclo de resumen (por ejemplo, en una función llamada desde alguna ng-click
directiva), esto no esperará nada, el código se ejecutará de inmediato. Si está dentro de una llamada asincrónica, por ejemplo a setTimeout
, $apply
se activará un nuevo ciclo de resumen ( ).
Entonces, en términos de rendimiento, siempre es mejor llamar $evalAsync
, a menos que sea importante para usted que la vista esté actualizada antes de ejecutar su código, por ejemplo, si necesita acceder a algún atributo DOm, como el ancho de los elementos y similares.
Si desea más detalles sobre la distinción entre $ timeout, $ evalAsync, $ digest, $ apply, lo invito a leer mi respuesta sobre esa otra pregunta: https://stackoverflow.com/a/23102223/1501926
También asegúrese de leer la documentación :
$ EvalAsync no garantiza cuándo se ejecutará la expresión, solo que:
- se ejecutará después de la función que programó la evaluación (preferiblemente antes de la representación DOM).
- se realizará al menos un ciclo de $ digest después de la ejecución de la expresión.
Nota: si esta función se llama fuera de un ciclo $ digest, se programará un nuevo ciclo $ digest . Sin embargo, se recomienda llamar siempre al código que cambia el modelo desde una llamada $ apply. Eso incluye el código evaluado a través de $ evalAsync.