如何在typeahead / bloodhound中对搜索结果进行排序?

时间:2015-05-05 09:24:37

标签: javascript typeahead.js typeahead bloodhound

我正在使用typeahead.js 0.11.1并尝试对来自远程源的结果进行排序。根据代码,应该有可能覆盖bloodhound的默认排序功能。但我的调用函数从未调用过。识别功能的计数相同。

这是我的代码:

    var bloodhoundSearchEngine = new Bloodhound({
    // we do not need any tokenization cause this will be done on the server
    datumTokenizer : function(d) {
        return d;
    },
    queryTokenizer : function(q) {
        return q;
    },
    sorter : function(itemA, itemB) {
        console.log(itemA);
        if (itemA.count < itemB.count) {
            return -1;
        } else if (itemA.count > itemB.count) {
            return 1;
        } else
            return 0;
    },
    identify : function(item) {
        console.log(itemA);
        return item.value;
    },
    remote : {
        url : '/suggest/?term=%term',
        wildcard : '%term',
        transform : function(response) {
            return $.map(response.suggestItems, function(item) {
                return {
                    value : item.value,
                    count : item.count
                };
            });
        },
        rateLimitBy : 'debounce',
        rateLimitWait : 300
    }
});

$('#typeaheadinput .typeahead')
        .typeahead(
                {
                    hint : true,
                    highlight : true,
                    minLength : 1
                },
                {
                    name : 'existing-names',
                    display : 'value',
                    limit : 20,
                    source : bloodhoundSearchEngine.ttAdapter()
                });

有没有人知道如何实现这个目标?

2 个答案:

答案 0 :(得分:5)

未调用分拣机因为我使用自定义转换功能转换来自远程服务器的建议。因此,我在转换函数中包含了对分拣机的调用。以下代码适用于我:

var bloodhoundSearchEngine = new Bloodhound({
    // we do not need any tokenization cause this will be done on the server
    datumTokenizer : function(d) {
        return d;
    },
    queryTokenizer : function(q) {
        return q;
    },
    sorter : function(itemA, itemB) {
        console.log(itemA);
        if (itemA.count < itemB.count) {
            return -1;
        } else if (itemA.count > itemB.count) {
            return 1;
        } else
            return 0;
    },
    identify : function(item) {
        console.log(itemA);
        return item.value;
    },
    remote : {
        url : '/suggest/?term=%term',
        wildcard : '%term',
        transform : function(response) {
            return $.map(bloodhoundSearchEngine.sorter(response.suggestItems), function(item) {
                return {
                    value : item.value,
                    count : item.count
                };
            });
        },
        rateLimitBy : 'debounce',
        rateLimitWait : 300
    }
});

$('#typeaheadinput .typeahead')
        .typeahead(
                {
                    hint : true,
                    highlight : true,
                    minLength : 1
                },
                {
                    name : 'existing-names',
                    display : 'value',
                    limit : 20,
                    source : bloodhoundSearchEngine.ttAdapter()
                });

答案 1 :(得分:0)

由于某种原因,我也没有调用sorted函数,并且感谢René我使它能够正常工作。

var blood = new Bloodhound({
sorter: function(a, b) {
    var input_string = $(selector).val();
    distance = Levenshtein.get(a.name, input_string) - Levenshtein.get(b.name, input_string)
    return distance;
},
remote: {
    transform : function(response) {
        return blood.sorter(response)
    },
},