Perché sta usando if (! $ Scope. $$ phase) $ scope. $ Apply () un anti-pattern?

A volte ho bisogno di usare $scope.$apply nel mio codice e talvolta lancia un errore “digest già in corso”. Così ho iniziato a trovare un modo per aggirare questo problema e ho trovato questa domanda: AngularJS: Prevenire l’errore $ digest già in corso quando si chiama $ scope. $ Apply () . Tuttavia nei commenti (e nel wiki angular) puoi leggere:

Non fare se (! $ Scope. $$ phase) $ scope. $ Apply (), significa $ scope. $ Apply () non è abbastanza alto nello stack di chiamate.

Quindi ora ho due domande:

  1. Perché è esattamente un anti-modello?
  2. Come posso usare tranquillamente $ scope. $ Apply?

Un’altra “soluzione” per impedire l’errore “digest già in corso” sembra utilizzare $ timeout:

 $timeout(function() { //... }); 

E ‘la strada da percorrere? È più sicuro? Quindi ecco la vera domanda: come posso eliminare completamente la possibilità di un errore di “digest già in corso”?

PS: sto usando solo $ scope. $ Si applicano ai callback non angularjs che non sono sincroni. (per quanto ne so, quelle sono situazioni in cui è necessario utilizzare $ scope. $ applicare se si desidera applicare le modifiche)