Teste de digest com variáveis bindadas no template

O que é este teste

O AngularJS só atualiza a tela quando roda um digest: um ciclo em que ele compara cada variável observada com o valor anterior e aplica as diferenças no HTML. Esse ciclo é disparado automaticamente por tudo que passa pelo Angular, como ng-click, $http e $timeout. Código que roda fora dele, como um setTimeout puro, altera o $scope sem que a tela perceba.

Cada botão abaixo altera o mesmo valor de uma forma diferente. Compare o Valor exibido com o Registro: o registro escreve direto no DOM e sempre aparece, enquanto o valor só muda na tela quando um digest acontece. Alguns cenários também escrevem no console do navegador.

Valor:

Fora do Angular (setTimeout)

Altera o $scope fora do digest: a view não atualiza
Dispara um digest a partir do $rootScope
Dispara um digest só neste escopo e nos filhos
Sem digest em andamento, agenda um novo no próximo tick

Serviços do Angular

Agenda um novo digest sempre
O $apply depois do $timeout é redundante
Sem callback, só agenda um digest

Dentro do digest (ng-click)

Já existe um digest em andamento: lança "$digest already in progress"
Tenta agendar a expressão do seu callback no digest atual ou agenda um novo
Agenda um $apply para ~10ms depois, sem conflitar com o digest atual