cuando se llama $ digest cycle?

Estoy muy confundido cuando un ciclo de digestión está sucediendo, se llama periódicamente en función de un temporizador cada 50 ms (como aquí dice e implica aquí ) o se llama después de cada evento que ingresa al contexto angular (como aquí dice, aquí y aquí )?

Ejemplo cuando es materia:

En mi modelo, tengo una variable llamada myVar con el valor de 3. En mi HTML, tengo {{myvar}} . Un evento como un clic de botón se activa y genera un controlador en el controlador, el código dentro del controlador es:

 $scope.myVar = 4; // some heavy actions takes place for 3 seconds... $scope.myVar = 5; 

Suponiendo que el subproceso de interfaz de usuario no está bloqueado, ¿qué verá el usuario después de hacer clic en el botón? ¿verá solo 5 o verá 4 y después de 3 segundos 5?

Creo que la descripción del ciclo de resumen en http://blog.bguiz.com/post/60397801810/digest-cycles-in-single-page-apps que es

código que se ejecuta en un intervalo

es muy engañoso, y para ser honesto, cuando me refiero a Angular, incluso diría que está mal. Para citar a Pawel Kozlowski, Dominar el desarrollo de aplicaciones web con AngularJS

AngularJS no utiliza ningún tipo de mecanismo de sondeo para verificar periódicamente los cambios del modelo

Para demostrar que no hay votación, si tiene una plantilla de

 

{{state}}

y código de controlador de

 $scope.state = 'Initial'; // Deliberately *not* using $timeout here $window.setTimeout(function() { $scope.state = 'Changed'; },1000); 

como en este plunker , la cadena que se muestra al usuario permanecerá como Initial y nunca cambiará a Changed .

Si se pregunta por qué a menudo ve llamadas para $apply , pero no siempre, es probable que se deba a que varias directivas que vienen con Angular, como ngClick o ngChange se llamarán a $apply , que luego activará el ciclo. Los escuchas de eventos directamente a los eventos nativos de JS no harán esto, por lo que tendrán que llamar deliberadamente $apply para que los cambios se reflejen en las plantillas.

El proceso de resumen se inicia cuando cualquiera de los siguientes ocurre como parte del contexto angular:

  • Eventos DOM (como ng-clic, etc.)
  • Ajax con devoluciones de llamada ($ http, etc.)
  • Temporizadores con devoluciones de llamada ($ tiempo de espera, etc.)
  • llamando $ aplica, $ digest
  • etc.

Es importante tener en cuenta que los eventos DOM normales relacionados con el navegador (onclick, etc.) y setTimeout no desencadenarían un proceso de resumen ya que funcionan a partir de “Contexto angular”.

Aprendí lo anterior de lo siguiente: Angularjs Digest Cycle - TechCBT

Lo anterior es una instantánea rápida de un tutorial muy detallado disponible aquí: https://www.youtube.com/watch?v=SYuc1oSjhgY

Cualquier variable de ámbito AngularJS cuando se maneja desde fuera (incluido ajax) necesita un $ apply ().

setTimeout es la función de Javascript So $apply es necesaria para actualizar los valores de angularjs.

$timeout es una función angularjs que devuelve promesa y se ocupa del scope actual y se ejecuta en el mismo ciclo de resumen.

Por lo tanto, no es necesario $apply() para actualizar los valores.