$apply vs $digest in directive testing
angularjs, angularjs-directive
Solution
`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`.
Problem
If I have a directive that responds to the status of a particular attribute on the scope, and I want to change that attribute in my test and verify that it responds correctly, which is the best way of doing that change? I've seen both these patterns: ``` scope.$apply(function() { scope.myAttribute = true; }); ``` and ``` scope.myAttribute = true; scope.$digest(); ``` What is the difference between them, and which is better and why?