Después de buscar ejemplos de cómo establecer elementos de enfoque con angular, vi que la mayoría de ellos usa alguna variable para observar y luego establecer el enfoque, y la mayoría de ellos usa una variable diferente para cada campo en el que quieren establecer el enfoque. En una forma, con muchos campos, eso implica muchas variables diferentes.
Con jquery en mente, pero queriendo hacer eso de manera angular, hice una solución que establecemos el foco en cualquier función usando la identificación del elemento, así que, como soy muy nuevo en angular, me gustaría obtener algunas opiniones si de esa manera es correcto, tengo problemas, lo que sea, cualquier cosa que pueda ayudarme a hacer esto de la mejor manera en angular.
Básicamente, creo una directiva que observa un valor de alcance definido por el usuario con la directiva, o el focusElement predeterminado, y cuando ese valor es el mismo que el ID del elemento, ese elemento establece el foco en sí.
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();
})
}
};
});
Una entrada que necesita enfocarse por alguna razón, lo hará de esta manera
<input my-focus id="input1" type="text" />
Aquí cualquier elemento para establecer el foco:
<a href="" ng-click="clickButton()" >Set focus</a>
Y la función de ejemplo que establece el enfoque:
$scope.clickButton = function() {
$scope.focusElement = "input1";
}
¿Es una buena solución en angular? ¿Tiene problemas que con mi mala experiencia todavía no veo?
Acerca de esta solución, podríamos simplemente crear una directiva y adjuntarla al elemento DOM que debe obtener el foco cuando se cumple una condición determinada. Al seguir este enfoque, evitamos acoplar el controlador a los ID de elementos DOM.
Directiva de código de muestra:
Un posible uso
});
HTML
fuente
myCondition
variable $ scope ya se haya establecido en verdadero y luego el usuario elija enfocarse en otro elemento? ¿Puede volver a activar el enfoque cuandomyCondition
ya es verdadero? Su código observa los cambios para el atributofocusOnCondition
pero no se activará cuando el valor que intentas cambiar sigue siendo el mismo.Me gusta evitar las búsquedas de DOM, los relojes y los emisores globales siempre que sea posible, así que utilizo un enfoque más directo. Utilice una directiva para asignar una función simple que se centre en el elemento directivo. Luego llame a esa función donde sea necesario dentro del alcance del controlador.
Aquí hay un enfoque simplificado para adjuntarlo al alcance. Vea el fragmento completo para manejar la sintaxis del controlador.
Directiva:
y en html:
o en el controlador:
Mostrar fragmento de código
Editado para proporcionar más explicaciones sobre el motivo de este enfoque y para ampliar el fragmento de código para su uso como controlador.
fuente
ng-repeat
, y solo quiero configurar la función de enfoque para la primera. ¿Alguna idea de cómo podría establecer condicionalmente una función de enfoque<input>
basada en,$index
por ejemplo?assign-focus-function-if="{{$index===0}}"
, y luego, como la primera línea de la directiva, salga antes de asignar una función si eso no es cierto:if (attr.assignFocusFunctionIf===false) return;
tenga en cuenta que estoy verificando si es explícitamentefalse
y no solo falsey, por lo que la directiva seguirá funcionando si ese atributo no está definido._.set(scope, attributes.focusOnSaveInput, function() { element.focus(); })
.Puedes probar
por ej.
está trabajando para mí.
fuente
Otra opción sería usar la arquitectura pub-sub incorporada de Angular para notificar a su directiva que se enfoque. Similar a los otros enfoques, pero luego no está directamente vinculado a una propiedad, sino que está escuchando su alcance para una clave en particular.
Directiva:
HTML:
Controlador:
fuente
Preferí usar una expresión. Esto me permite hacer cosas como centrarme en un botón cuando un campo es válido, alcanza una cierta longitud y, por supuesto, después de la carga.
En una forma compleja, esto también reduce la necesidad de crear variables de alcance adicionales con el fin de enfocar.
Ver https://stackoverflow.com/a/29963695/937997
fuente