我正在尝试创建一个继承自 ValidationTextBox 的自定义 Dojo ValidationIdBox 小部件。我的自定义小部件将添加与后端服务器的异步重复 ID 检查。
我对 dijit.form.ValidationTextBox 进行了子类化并修改了两个方法:isValid() 和 validate()。但是,我无法让验证完全正常工作。该小部件捕获并突出显示缺少所需输入等问题。它甚至可以捕捉到重复 ID(出现工具提示),但无法按预期突出显示该字段。
我试图用下面的简化代码片段来隔离我的问题。它主要是原始的 Dojo 代码,稍作修改。我的一般策略是让小部件作为常规 ValidationTextBox 进行验证,然后测试重复 ID。我将 isValid() 修改为具有两种模式:普通验证和具有唯一性检查的验证。目前,唯一性测试故意总是失败。
以类似的方式,我修改了 validate() 来做正常的事情,然后如果正常验证成功但唯一性测试验证失败,则进行一些额外的处理。我尝试镜像与 ValidationTextBox 处于error
状态时相同的逻辑,但未镜像相同的效果:出现“ID 不可用”工具提示,但未出现带有感叹号的红色轮廓。
我检查了ValidationTextBox 的代码,但我无法弄清楚这种特殊样式是如何触发的……有人可以解释一下 ValidationTextArea 是如何工作的吗?具体来说,我不太确定如何使用this._maskValidSubsetError
,aria-invalid
和this.state
。
(有时,我希望出现工具提示,但不希望出现红色样式。喜欢在处理 AJAX 重复 ID 检查请求时显示。)
// If ValidationTextBoxValidates
isValid: function(isFocused, requireUnique) {
if (typeof requireUnique === 'undefined') requireUnique = false;
var isValid = this.inherited(arguments);
var isUnique = false;
return (requireUnique ? (isValid && isUnique) : isValid);
},
validate: function(/*Boolean*/ isFocused){
// summary:
// Called by oninit, onblur, and onkeypress.
// description:
// Show missing or invalid messages if appropriate, and highlight textbox field.
// tags:
// protected
var message = "";
var isValid = this.disabled || this.isValid(isFocused);
if(isValid){ this._maskValidSubsetError = true; }
var isEmpty = this._isEmpty(this.textbox.value);
var isValidSubset = !isValid && isFocused && this._isValidSubset();
this._set("state", isValid ? "" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && this._maskValidSubsetError) ? "Incomplete" : "Error"));
this.focusNode.setAttribute("aria-invalid", isValid ? "false" : "true");
if(this.state == "Error"){
this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus
message = this.getErrorMessage(isFocused);
}else if(this.state == "Incomplete"){
message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete
this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused
}else if(isEmpty){
message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text
}
/// Begin custom widget code
if (isValid && !this.isValid(isFocused, true) ) {
isValid = false;
var isValidSubset = !isValid && isFocused && this._isValidSubset();
this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus
message = 'ID not available';
this.focusNode.setAttribute("aria-invalid", isValid ? "false" : "true");
}
/// End custom widget code
this.set("message", message);
return isValid;
},