Nachdem ich nach Beispielen gesucht hatte, wie Fokuselemente mit Winkel eingestellt werden, stellte ich fest, dass die meisten von ihnen eine Variable verwenden, um auf den Fokus zu achten, und die meisten verwenden eine andere Variable für jedes Feld, für das sie den Fokus setzen möchten. In einer Form mit vielen Feldern impliziert dies viele verschiedene Variablen.
Mit Blick auf jquery, aber um dies auf eckige Weise zu tun, habe ich eine Lösung gefunden, bei der wir den Fokus in jeder Funktion unter Verwendung der Element-ID setzen. Da ich sehr neu in eckig bin, würde ich gerne einige Meinungen einholen, wenn Dieser Weg ist richtig, habe Probleme, was auch immer, alles, was mir helfen könnte, dies besser im Winkel zu tun.
Grundsätzlich erstelle ich eine Direktive, die einen vom Benutzer mit der Direktive definierten Bereichswert oder das focusElement des Standardwerts überwacht. Wenn dieser Wert mit der ID des Elements übereinstimmt, setzt dieses Element den Fokus selbst.
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();
})
}
};
});
Eine Eingabe, die aus irgendeinem Grund fokussiert werden muss, wird auf diese Weise ausgeführt
<input my-focus id="input1" type="text" />
Hier jedes Element, um den Fokus zu setzen:
<a href="" ng-click="clickButton()" >Set focus</a>
Und die Beispielfunktion, die den Fokus setzt:
$scope.clickButton = function() {
$scope.focusElement = "input1";
}
Ist das eine gute Lösung im Winkel? Hat es Probleme, die ich aufgrund meiner schlechten Erfahrung noch nicht sehe?
Zu dieser Lösung könnten wir einfach eine Direktive erstellen und sie an das DOM-Element anhängen, das den Fokus erhalten muss, wenn eine bestimmte Bedingung erfüllt ist. Durch diesen Ansatz vermeiden wir die Kopplung des Controllers an DOM-Element-IDs.
Beispielcode-Direktive:
Eine mögliche Verwendung
});
HTML
quelle
myCondition
Variable $ scope bereits auf true gesetzt wurde und der Benutzer dann auf ein anderes Element fokussiert? Können Sie den Fokus trotzdem erneut auslösen, wenn ermyCondition
bereits true ist ? Ihr Code überwacht die Änderungen für das AttributfocusOnCondition
, wird jedoch nicht ausgelöst, wenn Der Wert, den Sie ändern möchten, ist immer noch der gleiche.Ich vermeide DOM-Lookups, Uhren und globale Sender nach Möglichkeit, daher verwende ich einen direkteren Ansatz. Verwenden Sie eine Direktive, um eine einfache Funktion zuzuweisen, die sich auf das Direktivenelement konzentriert. Rufen Sie diese Funktion dann auf, wo immer dies im Rahmen der Steuerung erforderlich ist.
Hier ist ein vereinfachter Ansatz zum Anhängen an den Gültigkeitsbereich. Informationen zum Umgang mit der Controller-as-Syntax finden Sie im vollständigen Snippet.
Richtlinie:
und in HTML:
oder in der Steuerung:
Code-Snippet anzeigen
Bearbeitet , um weitere Erklärungen zum Grund für diesen Ansatz bereitzustellen und das Code-Snippet für die Verwendung als Controller zu erweitern.
quelle
ng-repeat
, und ich möchte nur die Fokusfunktion für die erste einstellen. Jede Idee , wie ich bedingt eine Fokusfunktion für setzen könnte<input>
auf der Grundlage$index
zum Beispiel?assign-focus-function-if="{{$index===0}}"
und dann als erste Zeile der Direktive, bevor Sie eine Funktion zuweisen, wenn dies nicht zutrifft:if (attr.assignFocusFunctionIf===false) return;
Hinweis Ich überprüfe, ob Es ist explizitfalse
und nicht nur falsch, daher funktioniert die Direktive immer noch, wenn dieses Attribut nicht definiert ist._.set(scope, attributes.focusOnSaveInput, function() { element.focus(); })
.Du kannst es versuchen
für zB.
Es funktioniert für mich.
quelle
Eine andere Möglichkeit wäre, Angulars integrierte Pub-Sub-Architektur zu verwenden, um Ihre Direktive zu benachrichtigen, sich zu konzentrieren. Ähnlich wie bei den anderen Ansätzen, aber es ist dann nicht direkt an eine Eigenschaft gebunden, sondern hört stattdessen auf den Bereich für einen bestimmten Schlüssel.
Richtlinie:
HTML:
Regler:
quelle
Ich habe es vorgezogen, einen Ausdruck zu verwenden. Auf diese Weise kann ich mich beispielsweise auf eine Schaltfläche konzentrieren, wenn ein Feld gültig ist, eine bestimmte Länge erreicht und natürlich nach dem Laden.
In einer komplexen Form reduziert dies auch die Notwendigkeit, zusätzliche Bereichsvariablen zum Zwecke der Fokussierung zu erstellen.
Siehe https://stackoverflow.com/a/29963695/937997
quelle