此电子邮件表单具有前端验证,仅检查其是否包含'@'。如果失败,它将打开错误消息'错误的格式'。手动触发ko验证错误
如果它通过,那么ajax调用会碰到一个后端API端点,它会对它执行更严格的正则表达式。即foo @ bar将通过前端验证,但未通过后端验证。
如果ajax结果作为ValidationError返回,这意味着它未能通过后端“有效模式”测试。在这种情况下,我想手动触发现有的前端“错误模式”错误消息。
如何从JavaScript内做到这一点?有没有可以在“case ValidationError:”中设置的变量或标志,它会这样做?
我的形式:
<form novalidate data-bind="submit: onRegister">
<div class="input-wrapper email" data-bind="validationElement: EmailAddress, css: { 'validation-success': EmailAddress.isModified() && EmailAddress.isValid() }">
<label for="registerModalEmail">@AuthenticationStrings.EmailLabel</label>
<input type="email" placeholder="Email" id="registerModalEmail" name="EmailAddress" data-bind="value: EmailAddress" required />
</div>
<div class="validation-error-message" id="email-address-error" data-bind="validationMessage: EmailAddress"></div>
<button>Create Account</button>
我的脚本:
self.EmailAddress = ko.observable().extend({
required: {
params: true,
message: 'Please provide an email'
},
pattern: {
/**
* Email validation is crazy, so just checking for @ symbol on front end.
* Back end will use a more complex regex.
*/
params: '@',
message: 'Bad pattern'
},
validation: {
async: true,
validator: function (val, parms, callback) {
$.ajax({
url: '/isEmailAllowed',
data: { 'EmailAddress': val },
type: 'POST',
success: function (results) {
if (results) {
switch (results.result) {
case "Valid":
callback(true); // email is unique
break;
case "ValidationError":
// email is malformed
// might be caught by front-end but can slip through
break;
default:
callback(false);// unknown error
}
}
}//,
//error: function (xhr) {
// if (xhr) {
// switch (xhr.statusText) {
// case "Conflict":
// callback(false); // show dupe email message
// break;
// default:
// callback(true); // defeat usual error message
// // trigger invalid email error
// }
// }
//}
});
},
message: 'This email exists. Sign in instead.'
}
});