2016-12-02 5 views
4

У меня есть следующая проблема: я хотел бы сосредоточиться на вводе. Но у меня есть счетчик, который запускается при загрузке страницы и скрыт только при выполнении определенных HTTP-запросов. Также все входы отключены до тех пор, пока запросы не будут выполнены. Так выглядит примерно так:Фокус на элементе html после его включения

<fieldset ng-disabled="!noPendingRequests"> 
    ... 
    <input id="input-to-focus-on" uib-datepicker-popup="MM/dd/yyyy" type="text" ng-model="startDate" ... /> 
    <spinner ng-hide="noPendingRequests"></spinner> 
</fieldset> 

Spinner - это обычная угловая директива. Существует требование автофокусировки на входе #input-to-focus-on, но оно не работает. Я попытался сосредоточиться сразу после того, как все http-запросы разрешены с использованием $q.all. Но это тоже не работает. Я предполагаю, что это происходит, потому что обратный вызов в $q запускается до того, как вход активируется. Я также пробовал использовать ручное включение:

$q.all(somePromises).then(function() { 
    angular.element('#input-to-focus-on')[0].disabled = false; 
    angular.element('#input-to-focus-on')[0].tabIndex = 1; 
    angular.element('#input-to-focus-on').focus(); 
}); 

Я понятия не имею, что делать и буду признателен за любую помощь. Спасибо заранее, ребята!

+2

Возможно, стоит попробовать [директива ngFocus] (https://docs.angularjs.org/api/ng/directive/ngFocus), поскольку она построена для углового потока. – GillesC

+0

@ GillesC спасибо за предложение, но, к сожалению, он тоже не работает –

+0

@ GillesC как насчет этого https://gist.github.com/zbicin/2b3fdf538936287c1a96? Я сделал это некоторое время назад, чтобы служить этой цели. –

ответ

2

Попробуйте обернуть вызов фокуса в блоке $timeout.

$timeout(function() { 
    angular.element('#input-to-focus-on').focus(); 
}); 
+0

Это работает! Это действительно работает, парень !!! Я не могу выразить, насколько я рад, что вы пришли сюда и написали этот ответ –

2

Попробуйте это:

$q.all(somePromises).then(function() { 
 
    $timeout(function() { 
 
     angular.element('#input-to-focus-on')[0].focus(); 
 
    }); 
 
});

Кроме того, убедитесь, что у вас есть $ таймаут впрыскивается в контроллер.

Смежные вопросы