我刚开始使用Dojo,我的问题如下: 我有一个FilteringSelect,我的搜索使用类似%john%的想法。
所以我的过滤器将在列表中选择并使用“john”进行评估,因此在写完john之后,我可以将列表作为:
安德鲁约翰 约翰所以“喜欢”这个想法很好 问题是:当我写“john”并按回车键时。所选名称始终是列表中的第一个名称“Andrew John”,而不是第二个完全匹配的名称。任何人都有一个ideia如何解决这个问题?
谢谢
答案 0 :(得分:0)
FilteringSelect的正常行为总是得到组合框的第一个元素。因为通常这是完全匹配。由于我的serach在文本中“喜欢”,第一个元素并不总是确切的macth。
所以,为了解决我的问题,我更改了FilteringSelect.js,所以我检查一下是否在combobox选项中有完全匹配并返回此元素。在我的情况下,精确匹配可以是组合框列表中的第二个,第三个....如果没有,我会返回第一个(如前所述)。
这里是代码:
> _callbackSetLabel: function( /*Array*/ result,
/*Object*/ dataObject,
/*Boolean?*/ priorityChange){
// summary:
// Callback function that dynamically sets the label of the
// ComboBox
// setValue does a synchronous lookup,
// so it calls _callbackSetLabel directly,
// and so does not pass dataObject
// still need to test against _lastQuery in case it came too late
if((dataObject && dataObject.query[this.searchAttr] != this._lastQuery) || (!dataObject && result.length && this.store.getIdentity(result[0]) != this._lastQuery)){
return;
}
if(!result.length){
//#3268: do nothing on bad input
//#3285: change CSS to indicate error
this.valueNode.value = "";
dijit.form.TextBox.superclass._setValueAttr.call(this, "", priorityChange || (priorityChange === undefined && !this._focused));
this._isvalid = false;
this.validate(this._focused);
this.item = null;
}else{
//because the combobox have a like of the word the first element may no be the exact match
for(var j = 0; j < result.length; j++) {
//check if in the result there is the text that the user typed
if(dataObject && result[j].i["id"].toLowerCase() === dataObject.query[this.searchAttr].toLowerCase())
{
//return the exact match
this.set('item', result[j], priorityChange);
return;
}
}
// if there isn't a exact match return the first of the list
this.set('item', result[0], priorityChange);
}
},