我已按如下方式配置了dojo组合框:
this.autoComplete = new dijit.form.ComboBox( {
id : this.name + "_term",
name : "search_id",
store : this.dataStore,
searchAttr : "term",
pageSize : "30",
searchDelay:500,
value : this.config.inputText,
hasDownArrow : false
}, this.name + "_term");
这里的问题是,当用户输入他们的搜索词并在500ms之前点击[Enter]时,服务请求被取消(复制和粘贴搜索词时很常见)。我期望发生的是它只是忽略[Enter]事件,直到请求完成并且选项显示在下拉列表中。然后,用户可以再次按Enter键以提交响应中的第一个项目。
希望得到一些关于如何处理这种情况的建议。我已经通过api查看了dijit.form.ComboBox,但没有看到任何引人注目的内容可以解决这个问题。请注意,如果我使用FilteringSelect而不是ComboBox,则存在完全相同的行为。有趣的是,FilteringSelect将此场景视为由“invalidMessage”参数处理的错误。我不明白将此视为错误的好处。
答案 0 :(得分:1)
我(暂时)通过覆盖_onKeyPress函数猴子修补dijit.form.ComboBox解决了这个问题。我正在使用dojo v1.5并注意到v1.6将_onKeyPress更改为_onKey。因此升级显然会破坏事物。
我更新了[Enter]事件处理,如下所示:
case dk.ENTER:
// prevent submitting form if user presses enter. Also
// prevent accepting the value if either Next or Previous
// are selected
if(highlighted){
// only stop event on prev/next
if(highlighted == pw.nextButton){
this._nextSearch(1);
dojo.stopEvent(evt);
break;
}else if(highlighted == pw.previousButton){
this._nextSearch(-1);
dojo.stopEvent(evt);
break;
}
}else{
if (!module.autoComplete.item) {
doSearch = true;
}
// Update 'value' (ex: KY) according to currently displayed text
this._setBlurValue(); // set value if needed
this._setCaretPos(this.focusNode, this.focusNode.value.length); // move cursor to end and cancel highlighting
}
// default case:
// prevent submit, but allow event to bubble
evt.preventDefault();
// fall through
break;
有问题的代码是:
if (!module.autoComplete.item) {
doSearch = true;
}
我基本上只是在自动完成对象实例存在且尚未收到任何项目时才告诉它进行搜索。这是一个丑陋的黑客,但它正在解决这个问题。我仍然会喜欢一些关于如何更好地处理这个问题的建议。