Proponuję napisanie dyrektywę, która będzie podłączyć do NgModelController#$parsers rurociągu (sprawdź „Custom Validation” od http://docs.angularjs.org/guide/forms) .
Oto szkic takiej dyrektywy:
.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;
}
});
}
};
}])
Jeżeli Users.query
jest wywołanie asynchronicznej Aby sprawdzić, czy e-mail jest unikatowy lub nie. Oczywiście powinieneś zastąpić to wezwaniem do twojego back-endu.
Po zakończeniu, dyrektywa ta może być używana tak:
<input type="email" ng-model="user.email" unique-email>
Przykład tej dyrektywy została podjęta z angular-app że niektórzy członkowie angularjs społeczności starają się połączyć w celu zilustrowania typowych przypadków użycia. Warto sprawdzić, jak to wszystko pasuje do kompletnej aplikacji.
Dziękuję za odpowiedź. Czy możesz również zasugerować, jak porównać poprzednią wartość. –
Twoje rozwiązanie działa dobrze, ale mam do czynienia z jednym problemem, gdy otrzymuję oddzwanianie z serwera, moja cała forma staje się jasna –
Jak zadzwonić z serwera? –