内容简介:翻译自:https://stackoverflow.com/questions/15592117/email-form-validation-one-at-a-time
我正在尝试为电子邮件字段实现表单验证.验证应该做到以下:
>检查是否已通过必需属性输入电子邮件,如果未输入电子邮件则显示消息
>检查电子邮件是否具有有效格式(似乎是在没有指定属性的情况下自动完成)并在格式错误时显示消息
>检查电子邮件在$http.get电话上是否唯一,并在发现电子邮件时显示一条消息,因此无法使用
我希望显示第一条消息,如果该字段为空,则在电子邮件无效且第三条消息出现时显示第二条消息,如果找到电子邮件地址,因此一次不唯一.
如果我只尝试“required”属性,这很有效,但是一旦我添加了我的email-available指令属性,它就不再检查电子邮件的格式,并且email-available指令与required属性一起执行.两个消息都会弹出,但我只希望用户一次看到一条消息.
我正在使用angularjs 1.1.3.
谁能告诉我,我可能做错了什么?
<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;
}
});
}
};
});
我看到你已经解决了自己的问题,但我想我可以在这里给你一些提示/建议(我希望):
1)你需要做的就是确保你的验证器在内置的角度验证器推入()后运行到ctrl.$parsers,而不是unshift()它.
2)由于先前运行的验证程序显示它无效(即如果字段已经失效,如果您不想进行Ajax调用),则要使验证程序无法运行.您只需要在验证器内的if语句中检查ctrl.$invalid.
3)在开始ajax调用之前以及收到之后,您需要单独调用$setValidity()来使表单无效.这样,在AJAX返回之前,您的表单无效,并说明它是否有效.
4)这可能很小,但除非你添加一个ctrl.$formatter,最初分配给$scope中对象的值在写入屏幕之前不会被验证.如果您的表单通过路由,ng-repeat或ng-include动态添加到屏幕,并且预先填充了数据,则可能会出现问题.通常,所有验证器都应具有$parser组件(view – > model)和$formatter组件(model – > view).
5)谨慎一点.如果模型无效,大多数验证器都将完全删除模型中的值.因为你正在进行异步调用,所以你必须立即在解析器函数中返回viewValue.如果字段无效,解析器函数通常会返回undefined,从而防止无效数据出现在模型中.
6)由于验证器具有在$error对象中维护的状态,因此在最初命中此异步验证器时,您需要清除它.见下文.
7)旁注:在你的回答中,我注意到你在ajax响应处理程序中返回值…这对你没有任何作用.因为调用是异步的,所以你总是从该解析器返回undefined.它会更新你的型号吗?如果确实如此,我会感到惊讶.
以下是我如何更改您的原始指令以使其按您可能的方式工作:
app.directive('emailAvailable', function($http, $timeout) { // available
return {
require: 'ngModel',
link: function(scope, elem, attr, ctrl) {
console.log(ctrl);
// push the validator on so it runs last.
ctrl.$parsers.push(function(viewValue) {
// set it to true here, otherwise it will not
// clear out when previous validators fail.
ctrl.$setValidity('emailAvailable', true);
if(ctrl.$valid) {
// set it to false here, because if we need to check
// the validity of the email, it's invalid until the
// AJAX responds.
ctrl.$setValidity('checkingEmail', false);
// now do your thing, chicken wing.
if(viewValue !== "" && typeof viewValue !== "undefined") {
$http.get('/api/user/email/' + viewValue + '/available')
.success(function(data, status, headers, config) {
ctrl.$setValidity('emailAvailable', true);
ctrl.$setValidity('checkingEmail', true);
})
.error(function(data, status, headers, config) {
ctrl.$setValidity('emailAvailable', false);
ctrl.$setValidity('checkingEmail', true);
});
} else {
ctrl.$setValidity('emailAvailable', false);
ctrl.$setValidity('checkingEmail', true);
}
}
return viewValue;
});
}
};
});
翻译自:https://stackoverflow.com/questions/15592117/email-form-validation-one-at-a-time
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- ruby-on-rails – 无法将电子邮件地址字段放在登录表单(Authlogic)上
- SpringBoot实现发送电子邮件
- 绕过电子邮件格式过滤进行SQL注入
- javascript – 类型电子邮件不支持selectionrange
- php – 使用TCPDF发送电子邮件附件
- 在电子邮件正文中应用HTML格式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Development Recipes
Brian P. Hogan、Chris Warren、Mike Weber、Chris Johnson、Aaron Godin / Pragmatic Bookshelf / 2012-1-22 / USD 35.00
You'll see a full spectrum of cutting-edge web development techniques, from UI and eye candy recipes to solutions for data analysis, testing, and web hosting. Make buttons and content stand out with s......一起来看看 《Web Development Recipes》 这本书的介绍吧!