这是另一个我不敢相信尚未解决的问题……我正在创建一个注册表单。现在...我需要做一些 ajax 异步验证。这就是我现在正在做的事情(见底部的代码)。
很棒,它缓存了已经检查过的值,它是异步的,等等,但是:
您永远无法 10000% 确定它在提交之前已得到验证。这是一笔大买卖,因为我还在服务器端检查了一些东西。但仍然......让这个代码在提交时“强制”验证会将它变成一个真正的怪物!
对于一切都应该准备就绪的事情,这似乎需要做很多工作
(可能与 2 有关)我想不出一种方法来使它真正通用。我还有另外 10 个字段需要类似的验证,但所有验证都略有不同,除了 Ajax 调用......而且我没有剪切和粘贴此代码 10 次!
我错过了一些非常明显的东西吗?有任何想法吗?
define([
'dojo/_base/declare',
'dijit/form/ValidationTextBox',
'dojo/_base/lang',
'app/globals',
], function(
declare
, ValidationTextBox
, lang
, g
){
return declare('app.ValidationWorkspace', [ ValidationTextBox ], {
ajaxSaidNo: {},
ajaxSaidYes: {},
ajaxRequested: {},
onChange: function(value){
this.validate();
},
validator: function(value){
// console.log("Started validation for " + value);
// Ajax has already said no -- returning false straight away
if(this.ajaxSaidNo[value] ){
this.invalidMessage = 'Workspace taken';
return false;
}
// Run the normal field validators -- if they fail,
// return false
var validation = Validators.workspace(value);
if( ! validation.result){
this.invalidMessage = validation.message;
return false;
// At this point, regexp validators passed and Ajax hasn't said "no".
} else {
// console.log("OK, ajasSaidYes for " + value + " is " + this.ajaxSaidYes[value]);
if(! this.ajaxSaidYes[value] ){
g.stores.workspacesAnon.query({name: value}).then(
lang.hitch(this, function(res){
if(res && res.length ){
this.ajaxSaidNo[value] = true;
//console.log("Added to Ajaxfailed: " + value);
this.validate();
} else {
//console.log("Added to Ajaxsuccess: " + value);
this.ajaxSaidYes[value] = true;
this.validate();
}
})
);
}
return true;
}
},
invalidMessage: "Workspace name not valid",
missingMessage: "Workspace name cannot be empty",
});
}
);