После поиска примеров того, как установить элементы фокуса с помощью angular, я увидел, что большинство из них используют какую-то переменную для отслеживания, а затем устанавливают фокус, и большинство из них используют одну другую переменную для каждого поля, в котором они хотят установить фокус. В форме с большим количеством полей это подразумевает множество различных переменных.
Имея в виду jquery, но желая сделать это с помощью angular, я сделал решение, в котором мы устанавливаем фокус в любой функции, используя идентификатор элемента, поэтому, поскольку я очень новичок в angular, я хотел бы получить некоторые мнения, если это правильный способ, есть проблемы, что угодно, все, что могло бы помочь мне сделать это лучше в angular.
По сути, я создаю директиву, которая отслеживает значение области, определенное пользователем с помощью директивы, или focusElement по умолчанию, и когда это значение совпадает с идентификатором элемента, этот элемент сам устанавливает фокус.
angular.module('appnamehere')
.directive('myFocus', function () {
return {
restrict: 'A',
link: function postLink(scope, element, attrs) {
if (attrs.myFocus == "") {
attrs.myFocus = "focusElement";
}
scope.$watch(attrs.myFocus, function(value) {
if(value == attrs.id) {
element[0].focus();
}
});
element.on("blur", function() {
scope[attrs.myFocus] = "";
scope.$apply();
})
}
};
});
Вход, который по какой-то причине должен получить фокус, будет делать это
<input my-focus id="input1" type="text" />
Здесь любой элемент для установки фокуса:
<a href="" ng-click="clickButton()" >Set focus</a>
И пример функции, которая устанавливает фокус:
$scope.clickButton = function() {
$scope.focusElement = "input1";
}
Это хорошее решение для angular? Есть ли у него проблемы, которых я пока не вижу?
Что касается этого решения, мы могли бы просто создать директиву и прикрепить ее к элементу DOM, который должен получить фокус при выполнении заданного условия. Следуя этому подходу, мы избегаем привязки контроллера к идентификаторам элементов DOM.
Пример директивы кода:
Возможное использование
});
HTML
источник
myCondition
переменной $ scope уже установлено значение true, а затем пользователь решит сфокусироваться на другом элементе, можете ли вы все равно повторно запустить фокус, когдаmyCondition
уже установлено значение true, ваш код отслеживает изменения для атрибута,focusOnCondition
но не срабатывает, когда значение, которое вы пытаетесь изменить, остается прежним.Мне нравится избегать поиска DOM, наблюдения и глобальных эмиттеров, когда это возможно, поэтому я использую более прямой подход. Используйте директиву, чтобы назначить простую функцию, которая фокусируется на элементе директивы. Затем вызовите эту функцию везде, где это необходимо в рамках контроллера.
Вот упрощенный способ прикрепления его к области видимости. См. Полный фрагмент для обработки синтаксиса Controller-as.
Директива:
и в html:
или в контроллере:
Показать фрагмент кода
Отредактировано, чтобы предоставить более подробное объяснение причины такого подхода и расширить фрагмент кода для использования в качестве контроллера.
источник
ng-repeat
, которые я использую , и я хочу установить функцию фокуса только для первого. Любая идея, как я могу условно установить функцию фокуса, например, на<input>
основе$index
?assign-focus-function-if="{{$index===0}}"
, а затем в качестве первой строки директивы выйти раньше, прежде чем назначать функцию, если это не так:if (attr.assignFocusFunctionIf===false) return;
обратите внимание, я проверяю, если это явно,false
а не просто ложь, поэтому директива все равно будет работать, если этот атрибут не определен._.set(scope, attributes.focusOnSaveInput, function() { element.focus(); })
.Можешь попробовать
например, для
он работает для меня.
источник
Другой вариант - использовать встроенную в Angular архитектуру pub-sub, чтобы уведомить вашу директиву о необходимости сосредоточиться. Подобно другим подходам, но тогда он не привязан напрямую к свойству, а вместо этого прослушивает его область действия для определенного ключа.
Директива:
HTML:
контроллер:
источник
Я предпочел использовать выражение. Это позволяет мне делать такие вещи, как фокусировка на кнопке, когда поле допустимо, достигает определенной длины и, конечно же, после загрузки.
В сложной форме это также снижает потребность в создании дополнительных переменных области видимости для фокусировки.
См. Https://stackoverflow.com/a/29963695/937997
источник