Après avoir cherché des exemples de la façon dont les éléments de mise au point sont définis avec angulaire, j'ai vu que la plupart d'entre eux utilisent une variable pour surveiller la mise au point, et la plupart d'entre eux utilisent une variable différente pour chaque champ qu'ils souhaitent définir. Dans un formulaire, avec beaucoup de champs, cela implique beaucoup de variables différentes.
Avec jquery way à l'esprit, mais voulant le faire de manière angulaire, j'ai fait une solution selon laquelle nous nous concentrons sur n'importe quelle fonction en utilisant l'id de l'élément, donc, comme je suis très nouveau dans angular, j'aimerais avoir des opinions si cette façon est juste, avoir des problèmes, peu importe, tout ce qui pourrait m'aider à le faire de la meilleure façon en angulaire.
Fondamentalement, je crée une directive qui surveille une valeur de portée définie par l'utilisateur avec la directive, ou le focusElement de la valeur par défaut, et lorsque cette valeur est la même que l'ID de l'élément, cet élément se concentre lui-même.
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();
})
}
};
});
Une entrée qui a besoin de se concentrer pour une raison quelconque fera de cette façon
<input my-focus id="input1" type="text" />
Voici tout élément à définir:
<a href="" ng-click="clickButton()" >Set focus</a>
Et l'exemple de fonction qui définit le focus:
$scope.clickButton = function() {
$scope.focusElement = "input1";
}
Est-ce une bonne solution en angulaire? Y a-t-il des problèmes que je ne vois pas encore avec ma mauvaise expérience?
À propos de cette solution, nous pourrions simplement créer une directive et l'attacher à l'élément DOM qui doit obtenir le focus lorsqu'une condition donnée est satisfaite. En suivant cette approche, nous évitons de coupler le contrôleur aux ID d'élément DOM.
Exemple de directive de code:
Un usage possible
});
HTML
la source
myCondition
variable $ scope a déjà été définie sur true et que l'utilisateur choisit de se concentrer sur un autre élément, pouvez-vous toujours redéclencher le focus quandmyCondition
est déjà vrai, votre code surveille les modifications de l'attributfocusOnCondition
mais il ne se déclenchera pas lorsque la valeur que vous essayez de modifier est toujours la même.J'aime éviter les recherches DOM, les montres et les émetteurs globaux autant que possible, j'utilise donc une approche plus directe. Utilisez une directive pour attribuer une fonction simple qui se concentre sur l'élément directive. Appelez ensuite cette fonction partout où cela est nécessaire dans le cadre du contrôleur.
Voici une approche simplifiée pour l'attacher à la portée. Consultez l'extrait de code complet pour gérer la syntaxe en tant que contrôleur.
Directif:
et en html:
ou dans le contrôleur:
Afficher l'extrait de code
Modifié pour fournir plus d'explications sur la raison de cette approche et pour étendre l'extrait de code pour une utilisation en tant que contrôleur.
la source
ng-repeat
, et je veux uniquement définir la fonction de mise au point pour la première. Une idée de la façon dont je pourrais définir conditionnellement une fonction de mise au point<input>
basée sur,$index
par exemple?assign-focus-function-if="{{$index===0}}"
, puis en tant que première ligne de la directive, quittez tôt avant d'attribuer une fonction si ce n'est pas vrai:if (attr.assignFocusFunctionIf===false) return;
Notez que je vérifie si c'est explicitementfalse
et pas seulement faux, donc la directive fonctionnera toujours si cet attribut n'est pas défini._.set(scope, attributes.focusOnSaveInput, function() { element.focus(); })
.Tu peux essayer
par exemple.
ça marche pour moi.
la source
Une autre option serait d'utiliser l'architecture pub-sub intégrée d'Angular afin de notifier votre directive de focus. Similaire aux autres approches, mais il n'est alors pas directement lié à une propriété et écoute plutôt sa portée pour une clé particulière.
Directif:
HTML:
Manette:
la source
J'ai préféré utiliser une expression. Cela me permet de faire des choses comme me concentrer sur un bouton lorsqu'un champ est valide, atteint une certaine longueur, et bien sûr après le chargement.
Sur une forme complexe, cela réduit également le besoin de créer des variables de portée supplémentaires à des fins de concentration.
Voir https://stackoverflow.com/a/29963695/937997
la source