$apply vs $digest in directive testing
scope.$digest()
will fire watchers on the current scope, and on all of its children, too. scope.$apply
will evaluate passed function and run $rootScope.$digest()
.
The first one is faster, as it needs to evaluate watchers for current scope and its children. The second one is slower, as it needs to evaluate watchers for$rootScope
and all it's child scopes.
When an error occurs in one of the watchers and you use scope.$digest
, it's not handled via $exceptionHandler
service, so you need to handle exception yourself. scope.$apply
uses a try-catch
block internally and passes all exceptions to $exceptionHandler
.
As the documentation itself mentions $digest cycle is peformed any time you do $scope.$apply
. As per developer guide on scope
After evaluating the expression, the $apply method performs a $digest. In the $digest phase the scope examines all of the $watch expressions and compares them with the previous value.
And as per the Scope API documentation
Usually you don't call $digest() directly in controllers or in directives. Instead a call to $apply() (typically from within a directives) will force a $digest().
So you should not explicitly call $digest
, you calling $apply
method would trigger a digest cycle.