Do not rely on $evalAsync() for assigning focus.
$evalAsync() does not necessarily guarantee execution within a timer;
the provided function may well execute after the current $digest loop
without control returning to the browser. If we need a timer to ensure
focus() behaves reliably, we should explicitly use one via $timeout.
/**
* A directive which allows elements to be manually focused / blurred.
*/
-angular.module('element').directive('guacFocus', ['$parse', function guacFocus($parse) {
+angular.module('element').directive('guacFocus', ['$injector', function guacFocus($injector) {
+
+ // Required services
+ var $parse = $injector.get('$parse');
+ var $timeout = $injector.get('$timeout');
return {
restrict: 'A',
@@ -44,7 +48,7 @@ angular.module('element').directive('guacFocus', ['$parse', function guacFocus($
// Set/unset focus depending on value of guacFocus
$scope.$watch(guacFocus, function updateFocus(value) {
- $scope.$evalAsync(function updateFocusAsync() {
+ $timeout(function updateFocusAfterRender() {
if (value)
element.focus();
else
