Mit AngularJS kann ich verwenden ng-pristine
oder ng-dirty
erkennen, ob der Benutzer das Feld eingegeben hat. Ich möchte die clientseitige Validierung jedoch erst durchführen, nachdem der Benutzer den Feldbereich verlassen hat. Dies liegt daran, dass ein Benutzer, der ein Feld wie E-Mail oder Telefon eingibt, immer einen Fehler erhält, bis er seine vollständige E-Mail eingegeben hat. Dies ist keine optimale Benutzererfahrung.
AKTUALISIEREN:
Angular wird jetzt mit einem benutzerdefinierten Unschärfeereignis ausgeliefert: https://docs.angularjs.org/api/ng/directive/ngBlur
Antworten:
Angular 1.3 verfügt jetzt über ng-model-Optionen, und Sie können die Option
{ 'updateOn': 'blur'}
beispielsweise auf festlegen und sogar entprellen, wenn die Verwendung entweder zu schnell eingibt oder Sie einige teure DOM-Vorgänge (wie das Schreiben eines Modells) speichern möchten an mehrere DOM-Stellen und Sie möchten nicht, dass bei jedem Tastendruck ein $ Digest-Zyklus stattfindet.)https://docs.angularjs.org/guide/forms#custom-triggers und https://docs.angularjs.org/guide/forms#non-immediate-debounce-model-updates
Und entprellen
quelle
ng-change
Ereignisse empfangen möchten, bevor der Benutzer das Feld verlassen hat. In meinem Fall fordere ich beispielsweise neue Daten von meiner API an, sobald das Eingabefeld gültig ist, aber ich möchte keine Fehlermeldung anzeigen, sobald sie ungültig ist - ich möchte dies nur tun, wenn dies der Fall ist ungültig und das Unschärfeereignis ist aufgetreten.1.3.0 rc-3
und es nicht Feuer ,change
bisblur
, überprüfen Sie diese: plnkr.co/edit/RivVU3r7xfHO1hUybqMu?p=previewAb Version 1.3.0 ist dies problemlos möglich
$touched
, nachdem der Benutzer das Feld verlassen hat.https://docs.angularjs.org/api/ng/type/ngModel.NgModelController
quelle
updateOn: 'default'
was bedeutet, für Eingaben, Tasten und fürIch habe dieses Problem gelöst, indem ich die Vorschläge von @jlmcdonald erweitert habe. Ich habe eine Direktive erstellt, die automatisch auf alle Eingabe- und Auswahlelemente angewendet wird:
Dadurch werden verschiedene Elemente hinzugefügt
has-focus
undhas-visited
klassifiziert, wenn der Benutzer die Elemente fokussiert / besucht. Sie können diese Klassen dann zu Ihren CSS-Regeln hinzufügen, um Validierungsfehler anzuzeigen:Dies funktioniert gut, da Elemente immer noch $ ungültige Eigenschaften usw. erhalten, aber das CSS kann verwendet werden, um dem Benutzer eine bessere Erfahrung zu bieten.
quelle
formName.inputName.$dirty
. Ich würde vorschlagen, die Direktive zu bearbeiten, um einen ähnlichen BooleschenformName.inputName.$focused
Wert wie zu schreiben , anstatt Klassennamen für Unschärfe und Boolesche Werte für die Validierung zu verwenden.Ich habe das mit einem ziemlich einfachen Stück CSS geschafft. Dies erfordert, dass die Fehlermeldungen Geschwister der Eingabe sind, auf die sie sich beziehen, und dass sie eine Klasse von haben
error
.Nachdem diese beiden Anforderungen erfüllt wurden, werden alle Fehlermeldungen in Bezug auf ein fokussiertes Eingabefeld ausgeblendet, was meiner Meinung nach eckig sein sollte. Scheint wie ein Versehen.
quelle
Dies scheint standardmäßig in neueren Versionen von Angular implementiert zu sein.
Die Klassen ng-unberührt und ng-berührt werden jeweils vor und nach dem Fokus des Benutzers auf ein validiertes Element festgelegt.
CSS
quelle
In Bezug auf die Lösung von @ lambinator ... Ich habe den folgenden Fehler in angle.js 1.2.4 erhalten:
Ich bin nicht sicher, ob ich etwas falsch gemacht habe oder ob dies eine Änderung in Angular ist, aber das Entfernen der
scope.$apply
Anweisungen hat das Problem behoben und die Klassen / Zustände werden immer noch aktualisiert.Wenn dieser Fehler ebenfalls auftritt, versuchen Sie Folgendes:
quelle
Es könnte für Sie funktionieren, eine benutzerdefinierte Direktive zu schreiben, die die Javascript-Methode blur () umschließt (und beim Auslösen eine Validierungsfunktion ausführt). Es gibt ein Angular-Problem mit einem Beispiel (sowie eine generische Direktive, die an andere Ereignisse gebunden werden kann, die von Angular nicht nativ unterstützt werden):
https://github.com/angular/angular.js/issues/1277
Wenn Sie diesen Weg nicht gehen möchten, besteht Ihre andere Option darin, $ watch auf dem Feld einzurichten und erneut eine Validierung auszulösen, wenn das Feld ausgefüllt ist.
quelle
Um die gegebenen Antworten weiter zu erfassen, können Sie die Eingabe-Kennzeichnung vereinfachen, indem Sie CSS3-Pseudoklassen verwenden und besuchte Felder nur mit einer Klasse markieren, um die Anzeige von Validierungsfehlern zu verzögern, bis der Benutzer den Fokus auf das Feld verloren hat:
(Beispiel erfordert jQuery)
JavaScript
CSS
HTML
quelle
basierend auf @nicolas Antwort .. Reines CSS sollte der Trick sein, es wird nur die Fehlermeldung bei Unschärfe angezeigt
CSS
quelle
Hier ist ein Beispiel mit ng-messages (verfügbar in Winkel 1.3) und einer benutzerdefinierten Direktive.
Die Validierungsnachricht wird zum ersten Mal bei Unschärfe angezeigt, wenn der Benutzer das Eingabefeld verlässt. Wenn er den Wert korrigiert, wird die Validierungsnachricht sofort entfernt (nicht mehr bei Unschärfe).
JavaScript
HTML
PS. Vergessen Sie nicht, ngMessages herunterzuladen und in Ihr Modul aufzunehmen:
quelle
ng-model-options in AngularJS 1.3 (Beta zum Zeitpunkt dieses Schreibens) ist dokumentiert, um {updateOn: 'blur'} zu unterstützen. Bei früheren Versionen hat für mich Folgendes funktioniert:
Mit einer Vorlage wie dieser:
quelle
Feldstatus $ touch verwenden Das Feld wurde dafür berührt, wie im folgenden Beispiel gezeigt.
quelle
Sie können die CSS-Klasse mit Fehlerfehlern dynamisch festlegen (vorausgesetzt, Sie verwenden Bootstrap), indem Sie die Klasse ng und eine Eigenschaft für den Bereich des zugeordneten Controllers verwenden:
plunkr: http://plnkr.co/edit/HYDlaTNThZE02VqXrUCH?p=info
HTML:
Regler:
quelle
Wenn Sie Bootstrap 3 und lesscss verwenden, können Sie die Validierung bei Unschärfe mit dem folgenden weniger Snippet aktivieren:
quelle
Ich habe eine Richtlinie verwendet. Hier ist der Code:
Alle meine Eingabesteuerelemente haben ein span-Element als nächstes Element, in dem meine Validierungsnachricht angezeigt wird, und daher wird die Anweisung als Attribut zu jedem Eingabesteuerelement hinzugefügt.
Ich habe auch (optional) .has-focus und habe die CSS-Klasse in meiner CSS-Datei besucht, auf die in der Direktive verwiesen wird.
HINWEIS: Denken Sie daran, 'on-blur-val' genau auf diese Weise zu Ihrer Eingabesteuerung ohne die Apostrophe hinzuzufügen
quelle
Mit ng-focus können Sie Ihr Ziel erreichen. Sie müssen ng-focus in Ihrem Eingabefeld angeben. Und während Sie Ihre ng-show-Derivate schreiben, müssen Sie auch eine Logik schreiben, die nicht gleich ist. Wie der folgende Code:
<input type="text" class="form-control" name="inputPhone" ng-model="demo.phoneNumber" required ng-focus> <div ng-show="demoForm.inputPhone.$dirty && demoForm.inputPhone.$invalid && !demoForm.inputPhone.$focused"></div>
quelle
Wir können Onfocus- und Onblur-Funktionen verwenden. Wäre einfach und am besten.
Versuch es hier:
http://plnkr.co/edit/NKCmyru3knQiShFZ96tp?p=preview
quelle