Depois de procurar exemplos de como definir elementos de foco com angular, vi que a maioria deles usa alguma variável para observar e definir o foco, e a maioria deles usa uma variável diferente para cada campo em que deseja definir o foco. Em um formulário, com muitos campos, isso implica em muitas variáveis diferentes.
Com o jquery way em mente, mas querendo fazer isso de forma angular, fiz uma solução que colocamos o foco em qualquer função usando o id do elemento, então, como sou muito novo em angular, gostaria de obter algumas opiniões se desse jeito é certo, tenho problemas, enfim, qualquer coisa que pudesse me ajudar a fazer isso da melhor forma no angular.
Basicamente, eu crio uma diretiva que observa um valor de escopo definido pelo usuário com a diretiva, ou o focusElement padrão, e quando esse valor é o mesmo que o id do elemento, esse elemento define o próprio foco.
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();
})
}
};
});
Uma entrada que precisa de foco por algum motivo, fará desta forma
<input my-focus id="input1" type="text" />
Aqui, qualquer elemento para definir o foco:
<a href="" ng-click="clickButton()" >Set focus</a>
E a função de exemplo que define o foco:
$scope.clickButton = function() {
$scope.focusElement = "input1";
}
Essa é uma boa solução em angular? Ele tem problemas que eu ainda não vejo com minha experiência ruim?
Sobre esta solução, poderíamos apenas criar uma diretiva e anexá-la ao elemento DOM que deve obter o foco quando uma determinada condição for satisfeita. Seguindo essa abordagem, evitamos acoplar o controlador aos IDs do elemento DOM.
Diretiva de código de amostra:
Um uso possível
});
HTML
fonte
myCondition
variável $ scope já foi definida como true e então o usuário escolhe focar em outro elemento, você ainda pode reativar o foco quandomyCondition
já for true, seu código observa as mudanças para o atributo,focusOnCondition
mas não irá disparar quando o valor que você tenta alterar ainda é o mesmo.Gosto de evitar pesquisas DOM, relógios e emissores globais sempre que possível, então uso uma abordagem mais direta. Use uma diretiva para atribuir uma função simples que se concentra no elemento de diretiva. Em seguida, chame essa função sempre que necessário dentro do escopo do controlador.
Aqui está uma abordagem simplificada para anexá-lo ao escopo. Veja o snippet completo para lidar com a sintaxe do controlador como.
Diretriz:
e em html:
ou no controlador:
Exibir trecho de código
Editado para fornecer mais explicações sobre o motivo dessa abordagem e para estender o trecho de código para uso pelo controlador.
fonte
ng-repeat
e só quero definir a função de foco para o primeiro. Alguma ideia de como eu poderia definir condicionalmente uma função de foco com<input>
base em,$index
por exemplo?assign-focus-function-if="{{$index===0}}"
, e então, como a primeira linha da diretiva, saia antes de atribuir uma função se isso não for verdade:if (attr.assignFocusFunctionIf===false) return;
Observe que estou verificando se é explicitamentefalse
e não apenas falsey, então a diretiva ainda funcionará se esse atributo não for definido._.set(scope, attributes.focusOnSaveInput, function() { element.focus(); })
.Podes tentar
por exemplo.
está funcionando para mim.
fonte
Outra opção seria usar a arquitetura pub-sub integrada do Angular para notificar sua diretiva ao foco. Semelhante às outras abordagens, mas não está diretamente vinculado a uma propriedade e, em vez disso, está ouvindo seu escopo para uma chave específica.
Diretriz:
HTML:
Controlador:
fonte
Eu preferi usar uma expressão. Isso me permite fazer coisas como focar em um botão quando um campo é válido, atinge um determinado comprimento e, claro, após o carregamento.
Em um formulário complexo, isso também reduz a necessidade de criar variáveis de escopo adicionais para fins de foco.
Veja https://stackoverflow.com/a/29963695/937997
fonte