Я установил директиву ниже, чтобы сосредоточиться на "новейшем" поле ввода, которое добавлено на мою страницу. Это отлично работает, кроме одной проблемы. При загрузке страницы выбирается последний вход на странице. Я хочу, чтобы эта директива игнорировалась при загрузке страницы, поэтому я могу вместо этого установить фокус на кнопку с идентификатором #new-query
. Нужно ли вообще указывать этой директиве, чтобы начать просмотр области после того, как пользователь взаимодействует со страницей?
'use strict';
angular.module('app')
.directive('setFocus', setFocus);
function setFocus($timeout, $parse) {
return {
link: function(scope, element, attrs) {
var model = $parse(attrs.setFocus);
scope.$watch(model, function(value) {
if (value) {
$timeout(function() {
element[0].focus();
});
}
});
}
};
}
Пример того, как я использую эту директиву:
<div ng-show="parameter.repeatable" ng-repeat="index in parameter.values track by $index">
<input
name="parameter"
type="text"
ng-model="parameter.values[$index]"
set-focus="$last">
...
Поскольку входы добавляются на страницу посредством действий пользователя, фокус переходит на самый новый вход. Моя проблема заключается в том, что при загрузке страницы это действие нежелательно, только после того, как пользователь начнет взаимодействовать с полями ввода.
Вот обходной путь, который может быть подходящим
В контроллере:
$scope.page ={first_load: true};
Директива:
function setFocus($timeout, $parse) {
return {
link: function(scope, element, attrs) {
if (!scope.page.first_load && $last) {
$timeout(function() {
element[0].focus();
});
}
// last item of first rendering of 'ng-repeat' will update controller
if(scope.page.first_load && $last){
scope.page.first_load = false;
}
});
}
};
}
В вашем контроллере
$scope.loaded = false;
В вашей функции связи
link: function(scope, element, attrs) {
if (!scope.$parent.loaded) {
scope.$parent.loaded = true;
return;
}
// Do the focusing here
}
ng-repeat
создает дочернюю область .... только изменит текущую дочернюю область. Вот почему я использовал объект для наследования
$dirty
объекта для этого имени элемента. Не понятно, как вы используете это