我正在尝试为电子邮件字段实施表单验证。验证应执行以下操作:
- 检查是否已通过必需属性输入了电子邮件,如果未输入电子邮件,则显示一条消息
- 检查电子邮件是否具有有效的格式(似乎是在没有指定属性的情况下自动完成的)并在格式错误时显示消息
- 通过 $http.get 调用检查电子邮件是否是唯一的,并显示一条消息,以防找到电子邮件并因此无法使用
我希望出现第一条消息,如果该字段为空,如果电子邮件无效,则出现第二条消息,如果找到电子邮件地址,则出现第三条消息,因此一次不是唯一的。
如果我仅尝试使用“必需”属性,则此方法有效,但是一旦我添加了电子邮件可用指令属性,它就不再检查电子邮件的格式,并且电子邮件可用指令与必需属性一起执行。两条消息都会弹出,但我只希望用户一次看到一条消息。
我正在使用 angularjs 1.1.3。
有人可以告诉我我可能做错了什么吗?
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>
指示
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;
}
});
}
};
});