würde ich vorschlagen, eine Richtlinie zu schreiben, die in NgModelController#$parsers Pipeline stecken würden (überprüfen „Custom Validation“ von http://docs.angularjs.org/guide/forms) . Hier
ist eine Skizze einer solchen Richtlinie:
.directive('uniqueEmail', ["Users", function (Users) {
return {
require:'ngModel',
restrict:'A',
link:function (scope, el, attrs, ctrl) {
//TODO: We need to check that the value is different to the original
//using push() here to run it as the last parser, after we are sure that other validators were run
ctrl.$parsers.push(function (viewValue) {
if (viewValue) {
Users.query({email:viewValue}, function (users) {
if (users.length === 0) {
ctrl.$setValidity('uniqueEmail', true);
} else {
ctrl.$setValidity('uniqueEmail', false);
}
});
return viewValue;
}
});
}
};
}])
Wo die Users.query
einen Asynchron-Aufruf ist zu überprüfen, ob eine E-Mail eindeutig ist oder nicht. Natürlich sollten Sie dies durch einen Anruf an Ihr Back-End ersetzen.
<input type="email" ng-model="user.email" unique-email>
Beispiel dieser Richtlinie aus dem angular-app genommen wurde, dass einige der AngularJS Community-Mitglieder versuchen, zusammen zu stellen gemeinsame Anwendungsfälle zu illustrieren:
Wenn Sie fertig sind, kann diese Richtlinie wie so verwendet werden. Es könnte sich lohnen, zu sehen, wie all das in der kompletten App zusammenpasst.
Danke für Ihre Antwort, können Sie bitte auch vorschlagen, wie Sie den vorherigen Wert vergleichen. –
Ihre Lösung funktioniert gut, aber ich bin mit einem Problem konfrontiert, wenn ich einen Rückruf vom Server bekomme, wird meine ganze Form klar –
Wie rufen Sie vom Server? –