dijit.form.FilteringSelect选择错误的值

时间:2011-01-17 03:13:12

标签: dojo

我刚开始使用Dojo,我的问题如下: 我有一个FilteringSelect,我的搜索使用类似%john%的想法。

所以我的过滤器将在列表中选择并使用“john”进行评估,因此在写完john之后,我可以将列表作为:

安德鲁约翰 约翰
约翰阿伦 西蒙约翰

所以“喜欢”这个想​​法很好 问题是:当我写“john”并按回车键时。所选名称始终是列表中的第一个名称“Andrew John”,而不是第二个完全匹配的名称。任何人都有一个ideia如何解决这个问题?

谢谢

1 个答案:

答案 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);                
            }
        },