AngularJS Direktiven: ng-click wird nicht ausgelöst, nachdem blur
Betrachten Sie das folgende Beispiel:
<input type="text" ng-model="client.phoneNumber" phone-number>
<button ng-click="doSomething()">Do Something</button>
.directive("phoneNumber", function($compile) {
return {
restrict: 'A',
scope: true,
link: function(scope, element, attrs) {
scope.mobileNumberIsValid = true;
var errorTemplate = "<span ng-show='!mobileNumberIsValid'>Error</span>";
element.after($compile(errorTemplate)(scope)).on('blur', function() {
scope.$apply(function() {
scope.mobileNumberIsValid = /^\d*$/.test(element.val());
});
});
}
};
});
Blick auf die demo, wenn Sie sagen, 'a' am Ende der Telefonnummer ein, und klicken Sie auf die Schaltfläche doSomething()
ist nicht genannt. Wenn Sie die Schaltfläche erneut klicken, dann doSomething()
genannt wird.
Warum doSomething()
ist nicht das erste mal aufgerufen? Irgendwelche Ideen, wie man dieses Problem beheben?
Hinweis: Es ist wichtig, dass die Validierung auf blur.
- Wie wäre es damit?
#wrapper {width: 220px;}
. Ich denke, es ist besser, wenn Sie Ihr design bleiben, wie es ist, obwohl dynamischen Faktoren, d.h., Fehlermeldungen, Hinzugefügt und entfernt werden. Aber es ist ur nennen. - Bewegliche Knöpfe, um auf der gleichen Zeit, die Sie verwendet werden, ist sehr schlechtes UI-design. Ich würde einfach nur die Spanne es und ändern Sie die leere (
) text um zu sagen 'Fehler', wenn ein Fehler vorliegt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier: http://jsbin.com/epEBECAy/25/edit
Erläutert werden, die von anderen Antworten, die Taste bewegt wird, indem das Aussehen des span-Tags, bevor ein onmouseup-Ereignis auf den button erfolgt, wodurch das Problem bei Ihnen Auftritt. Der einfachste Weg, das zu erreichen, was Sie wollen, ist Stil der form, in der Weise, dass die Darstellung der Spannweite nicht dazu führen, die Taste zu verschieben (dies ist eine gute Idee im Allgemeinen von einer UX-Perspektive). Sie können dies durch umwickeln der
input
element in einemdiv
mit einem Stil, derwhite-space:nowrap
. So lange, wie es genug horizontaler Platz für die Spannweite ist, wird die Schaltfläche nicht bewegen und die ng-click-Ereignis funktioniert wie erwartet.Erklären
mousedown
Ereignis ausgelöst wird, auf die Schaltfläche element.blur
-, Weichzeichner-callback ausgelöst, der überprüfung von Eingaben Wert.mouseup
- Ereignis wird nicht ausgelöst. Dieser fungiert wie klicken Sie auf eine Schaltfläche, bewegen sich aber außerhalb von ihm vor dem loslassen der Maus auf Abbrechen, die Schaltfläche klicken. Dies ist der Grundng-click
wird nicht ausgelöst. Damouseup
- Ereignis wird nicht ausgelöst, auf den button.Lösung
Verwenden
ng-pattern
dynamisch validieren Sie die Eingabe-Wert, und einblenden/ausblenden Fehler Spannweite sofort nachngModel.$invalid
Eigenschaft.Demo 1 http://jsbin.com/epEBECAy/14/edit
- - - - - - Update 1 -----
Laut Autorin verlangen, aktualisierte Antwort mit einer anderen Lösung.
Demo 2 http://jsbin.com/epEBECAy/21/edit?html,js
HTML
Logik
Ich verwendet
ng-blur
Richtlinie über den Eingang trigger-Validierung. Wennng-mousedown
wird ausgelöst, bevorng-blur
,ng-blur
Rückruf zurückgestellt werden, bisng-mouseup
ausgelöst wird. Dies wird erreicht durch die Verwendung$q
service.blur
.ng-pattern
Es ist, weil die Richtlinie nach dem einlegen der
<span>Error</span>
unterhalb, wo der Knopf gerade befindet, sich mit den click-event-location. Sehen Sie dies, indem Sie die Schaltfläche über dem Textfeld, und alles sollte funktionieren.EDIT:
Wenn Sie wirklich müssen die Fehler in der gleichen position, und lösen das Problem ohne der Erstellung Ihrer eigenen, klicken Sie auf die Richtlinie, die Sie verwenden können
ng-mousedown
stattng-click
. Dies löst den click-code vor dem Umgang mit dem blur-event.ng-pattern
Nicht eine direkte Antwort, aber einen Vorschlag für das schreiben der Richtlinie anders (der html-Code ist der gleiche):
http://jsbin.com/OTELeFe/1/
Ich würde vorschlagen, mit
$parsers
und$setValidity
Möglichkeit, während der Validierung Telefonnummer.So, Sie werden in der Lage sein zu verwenden
$valid
- Eigenschaft auf ein Feld in deiner view:Wenn Sie möchten zeige Fehler nur auf
blur
Sie verwenden können (zu finden hier: AngularJS Formen - Validierung Der Felder Nach Benutzer Feld):So, Sie haben
hasFocus
Eigenschaft, wenn das Feld fokussiert ist und jetzthasVisited
Eigenschaft, wenn das Feld blured ein-oder mehrmals:Demo: http://jsfiddle.net/zVpWh/4/
Ich fixierte es mit den folgenden.