Ich versuche, Formularüberprüfung für ein E-Mail-Feld zu implementieren. Die Validierung sollte Folgendes tun:Email-Validierung einzeln
- Überprüfen Sie, ob E-Mail ohne Angabe eines automatisch getan werden eingegeben wurde wurde
- Überprüfen Sie, ob die E-Mail ein gültiges Format hat (erscheint eine Nachricht über erforderliche Attribut und angezeigt, wenn keine E-Mail eingegeben Attribut) und eine Meldung angezeigt, wenn das Format falsch ist
- überprüfen Sie, ob die E-Mail über ein $ http.get nennen einzigartig ist und eine Meldung angezeigt, falls wurde die E-Mail gefunden und daher nicht
verwendet werden können, Ich möchte, dass die erste Nachricht erscheint, wenn das fie ld ist leer, die zweite Nachricht erscheint, wenn die E-Mail ungültig ist und die dritte Nachricht erscheint, wenn die E-Mail-Adresse gefunden wird und daher nicht einzeln nacheinander angezeigt wird.
Das funktioniert, wenn ich nur mit dem Attribut "required" versuche, aber sobald ich mein per E-Mail verfügbares Direktivenattribut hinzufüge, prüft es nicht mehr das Format der E-Mail und die E-Mail-Anweisung wird zusammen mit der E-Mail ausgeführt erforderliches Attribut Beide Nachrichten erscheinen, aber ich möchte nur, dass der Benutzer jeweils eine Nachricht sieht.
Ich benutze angularjs 1.1.3.
Kann mir jemand sagen, was ich falsch machen könnte?
HTML
<div id="user_mod" class="mod_form" ng-show="userModScreenIsVisible">
<form name="mod_user" novalidate>
<input type="email" name="email" ng-model="user.email" placeholder="E-Mail" required email-available/>
<div class="user-help" ng-show="mod_user.email.$dirty && mod_user.email.$invalid">Invalid:
<span ng-show="mod_user.email.$error.required">Please enter your email.</span>
<span ng-show="mod_user.email.$error.email">This is not a valid email.</span>
<span ng-show="mod_user.email.$error.emailAvailable">This email address is already taken.</span>
</div>
</form>
Richtlinie
directive('emailAvailable', function($http) { // available
return {
require: 'ngModel',
link: function(scope, elem, attr, ctrl) {
ctrl.$parsers.unshift(function(viewValue) {
ctrl.$setValidity('emailAvailable', false);
if(viewValue !== "" && typeof viewValue !== "undefined") {
console.log("variable is defined");
$http.get('/api/user/email/' + viewValue + '/available')
.success(function(data, status, headers, config) {
console.log(status);
ctrl.$setValidity('emailAvailable', true);
return viewValue;
})
.error(function(data, status, headers, config) {
console.log("error");
ctrl.$setValidity('emailAvailable', false);
return undefined;
});
} else {
console.log("variable is undefined");
ctrl.setValidity('emailAvailable', false);
return undefined;
}
});
}
};
});
Ahhhaaaaa, das erklärt eine Menge Dinge. Die Standard-Validator-Methoden befinden sich also im $ parser. Wenn ich meine Validierungsmethoden auf den Start des Arrays verschiebe, anstatt sie an das Ende des Arrays zu schieben, werden die Standardvalidierungsmethoden von meiner Methode überschrieben. Sie haben auch einige Knoten in meinem Kopf geöffnet, wie die Winkelvalidierung wirklich funktioniert. Haben Sie das tatsächlich durch Lesen der eckigen Dokumentation herausgefunden? Oder haben Sie andere Quellen? :) Danke trotzdem, deine ausführliche Erklärung und das Plunker-Beispiel haben mich zu einem noch glücklicheren angularjs-Benutzer gemacht. –
Ich lese ihre [Quelle auf GitHub] (https://github.com/angular/angular.js/tree/master/src). ;) Dann war es ein Versuch und Irrtum. Ich schrieb auch einen [Blogeintrag darauf] (http://www.benlesh.com/2012/12/angular-js-custom-validation-via.html). –
Zweite Blesche Antwort Ich sah, das zweite Mal war ich beeindruckt! – darethas