我使用dojo表单并使用AJAX提交。我使用两种验证方法:在客户端和服务器端:
dojo.connect(form, "onsubmit", function(event){
dojo.stopEvent(event);
var digit_form = dijit.byId("user_profile_form");
if (!digit_form.validate()) {
return false;
}
// client-side validation is ok, so we submit form using AJAX
var xhrArgs = {
form: form,
handleAs: "json",
load: function(responseText){
// here I get response from server
// and if there are errors on server
// responseText object contains array with errors, so I
// need to show this errors to user
},
error: function(error) {
}
}
var deferred = dojo.xhrPost(xhrArgs);
}
问题是validate()方法向用户显示了不错的错误消息,但当我从服务器收到错误时,我无法像validate(()方法那样显示错误,所以我使用了不太好的本地javascript alert()方法。我希望在服务器端和客户端平等地显示验证错误。
对于每个服务器端错误,设置一个新的widget.SSError
属性。
error: function(error) {
widget.set('SSError','The value is invalid because server thought so...'
form.validate();
}
覆盖widget.isValid()
函数并使其检查新的widget.SSError
属性。
基于此消息,
var myCustomFS = dojo.declare(dijit.form.FIlteringSelect, {
postMixInProperties: function() {
this.inherited(arguments);
// Point _isValidOld at the function isValid currently points at
this._isValidOld = this.isValid;
// Point isValid at a new function
this.isValid = function() {
if (this.SSError) {
return false;
}
return this._isValidOld(); // Calls the original isValid function
}
}
};
将手表放在该值上,并在widget.SSError
发生变化时重置。
widget.watch('value', function(){
widget.set('SSError', false)
})