angularjs - compile - $ aplicar vs $ digest en pruebas directivas
directivas angularjs (2)
Si tengo una directiva que responde al estado de un atributo particular en el alcance, y quiero cambiar ese atributo en mi prueba y verificar que responda correctamente, ¿cuál es la mejor manera de hacer ese cambio?
He visto estos dos patrones:
scope.$apply(function() {
scope.myAttribute = true;
});
y
scope.myAttribute = true;
scope.$digest();
¿Cuál es la diferencia entre ellos, y cuál es mejor y por qué?
Como la documentación en sí misma menciona que $ competer cycle se realiza cada vez que se $scope.$apply
. Según la guía del desarrollador sobre el scope
Después de evaluar la expresión, el método $ apply realiza un $ digest. En la fase $ digest, el alcance examina todas las expresiones $ watch y las compara con el valor anterior.
Y según la documentation API de Scope
Por lo general, no se llama a $ digest () directamente en controladores o en directivas. En cambio, una llamada a $ apply () (normalmente desde dentro de directivas) forzará un $ digest ().
Por lo tanto, no debe llamar explícitamente $digest
, el método invocar $apply
provocaría un ciclo de resumen.
scope.$digest()
disparará a los observadores sobre el alcance actual, y sobre todos sus hijos, también. scope.$apply
evaluará la función pasada y ejecutar $rootScope.$digest()
.
El primero es más rápido, ya que necesita evaluar a los observadores para el alcance actual y sus hijos. El segundo es más lento, ya que necesita evaluar los observadores de $rootScope
y todos sus ámbitos secundarios.
Cuando ocurre un error en uno de los vigilantes y utiliza scope.$digest
, no se maneja a través del servicio $exceptionHandler
, por lo que debe manejar la excepción usted mismo. scope.$apply
utiliza un bloque try-catch
internamente y pasa todas las excepciones a $exceptionHandler
.