Parfois, j'ai besoin d'utiliser $scope.$apply
dans mon code et parfois cela génère une erreur "Digest déjà en cours". J'ai donc commencé à trouver un moyen de contourner cela et j'ai trouvé cette question: AngularJS: Empêche l'erreur $ digest déjà en cours lors de l'appel de $ scope. $ Apply () . Cependant, dans les commentaires (et sur le wiki angulaire), vous pouvez lire:
Ne faites pas si (! $ Scope. $$ phase) $ scope. $ Apply (), cela signifie que votre $ scope. $ Apply () n'est pas assez haut dans la pile d'appels.
Alors maintenant, j'ai deux questions:
- Pourquoi exactement est-ce un anti-modèle?
- Comment puis-je utiliser $ scope. $ Apply en toute sécurité?
Une autre «solution» pour éviter l'erreur «digest déjà en cours» semble utiliser $ timeout:
$timeout(function() {
//...
});
Est-ce la voie à suivre? Est-ce plus sûr? Voici donc la vraie question: comment puis-je éliminer entièrement la possibilité d'une erreur "digest déjà en cours"?
PS: J'utilise uniquement $ scope. $ Apply dans des callbacks non angularjs qui ne sont pas synchrones. (pour autant que je sache, ce sont des situations dans lesquelles vous devez utiliser $ scope. $ apply si vous voulez que vos modifications soient appliquées)
scope
de l'intérieur angulaire ou de l'extérieur angulaire. Donc, selon cela, vous savez toujours si vous devez appelerscope.$apply
ou non. Et si vous utilisez le même code pour lascope
manipulation angulaire / non angulaire , vous le faites mal, il devrait toujours être séparé ... donc fondamentalement, si vous rencontrez un cas où vous devez vérifierscope.$$phase
, votre code n'est pas conçu de manière correcte, et il y a toujours un moyen de le faire `` de la bonne manière ''