97 votes

$apply vs $digest dans les tests de directives

Si j'ai une directive qui répond à l'état d'un attribut particulier de l'étendue, et que je veux changer cet attribut dans mon test et vérifier qu'il répond correctement, quelle est la meilleure façon d'effectuer ce changement ?

J'ai vu ces deux modèles :

scope.$apply(function() {
    scope.myAttribute = true;
});

et

scope.myAttribute = true;
scope.$digest();

Quelle est la différence entre eux, lequel est le meilleur et pourquoi ?

205voto

Tadeusz Wójcik Points 2365

scope.$digest() ne déclenchera que les observateurs de la portée actuelle, scope.$apply évaluera la fonction passée et exécutera $rootScope.$digest() .

La première est plus rapide, car elle doit évaluer les observateurs pour la portée actuelle, la seconde est plus lente (elle doit évaluer les observateurs pour la portée actuelle). $rootScope et tous ses champs d'application enfants).

Lorsqu'une erreur se produit dans l'un des watchers et que vous utilisez scope.$digest il n'est pas traité via $exceptionHandler vous devez donc gérer les exceptions vous-même. scope.$apply utilise try catch en interne et transmet toutes les exceptions à $exceptionHandler .

12voto

Chandermani Points 19000

Comme le mentionne la documentation elle-même, le cycle $digest est effectué chaque fois que vous faites $scope.apply . Conformément au guide du développeur sur portée

Après avoir évalué l'expression, la méthode $apply effectue un $digest. Dans la phase $digest, l'étendue examine toutes les expressions $watch et les compare avec la valeur précédente.

Et selon la portée de l'API documentation

En général, on n'appelle pas $digest() directement dans les contrôleurs ou dans les directives. Au lieu de cela, un appel à $apply() (typiquement à l'intérieur d'une directive directives) forcera un $digest().

Vous ne devez donc pas appeler explicitement $digest vous appelez apply déclencherait un cycle de digestion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X