tôi sẽ đề nghị viết một chỉ thị đó sẽ cắm vào NgModelController#$parsers đường ống (đánh dấu "Custom Validation" từ http://docs.angularjs.org/guide/forms) .
Đây là một phác thảo của một chỉ thị như:
.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;
}
});
}
};
}])
Trường hợp Users.query
là một cuộc gọi async để kiểm tra xem một email là duy nhất hay không. Tất nhiên bạn nên thay thế điều này bằng một cuộc gọi đến back-end của bạn.
Khi hoàn tất, chỉ thị này có thể được sử dụng như sau:
<input type="email" ng-model="user.email" unique-email>
Ví dụ về chỉ thị này được lấy từ các angular-app rằng một số thành viên AngularJS cộng đồng cố gắng để đặt lại với nhau để minh họa chung trường hợp sử dụng. Nó có thể là giá trị kiểm tra ra để xem làm thế nào tất cả điều này phù hợp với nhau trong ứng dụng hoàn chỉnh.
Nguồn
2013-02-20 11:05:05
Cảm ơn câu trả lời của bạn, Bạn cũng có thể đề xuất cách so sánh giá trị trước đó. –
giải pháp của bạn đang hoạt động tốt, nhưng tôi đang đối mặt với một vấn đề, khi tôi nhận được cuộc gọi lại từ máy chủ, toàn bộ biểu mẫu của tôi bị xóa –
Làm thế nào để bạn gọi từ máy chủ? –