如何在追加搜索词时重用jquery-ui-autocomplete缓存结果?

时间:2013-01-02 23:07:15

标签: jquery-ui-autocomplete

我有以下JS方法将jQuery UI自动完成小部件绑定到搜索文本框。一切正常,包括缓存,除了我在追加我的搜索词时进行不必要的服务器调用,因为我没有重复使用刚检索到的结果。

例如,搜索“ab”会从服务器中获取一些结果。在搜索框中的“ab”之后键入“c”会从服务器获取“abc”结果,而不是重复使用缓存的“ab”结果并省略与“abc”不匹配的结果。

我沿着手动查找“ab”搜索结果的路径,使用正则表达式过滤它们以选择“abc”子集,但这看起来似乎我正在重新发明轮子。告诉窗口小部件使用“ab”结果的正确,规范方法是什么,但是为“abc”术语过滤它们并重新显示缩短的下拉列表?

function bindSearchForm() {
    "use strict";
    var cache = new Object();

    $('#search_text_field').autocomplete({
        minLength: 2,
        source: function (request, response) {
            var term = request.term;
            if (term in cache) {
                response(cache[term]);
                return;
            }
            $.ajax({type: 'POST',
                    dataType: 'json',
                    url: '/get_search_data',
                    data: {q: term},
                    success: function (data) {
                        cache[term] = data;
                        response(data);
                    }
            });
    });
}

2 个答案:

答案 0 :(得分:2)

这是我的“蛮力,重新发明轮子”的方法,现在看来是正确的解决方案。

function bindSearchForm() {
    "use strict";
    var cache = new Object();
    var terms = new Array();

    function cacheNewTerm(newTerm, results) {
        // maintain a 10-term cache
        if (terms.push(newTerm) > 10) {
            delete cache[terms.shift()];
        }
        cache[newTerm] = results;
    };

    $('#search_text_field').autocomplete({
        minLength: 2,
        source: function (request, response) {
            var term = request.term.toLowerCase();
            if (term in cache) {
                response(cache[term]);
                return;
            } else if (terms.length) {
                var lastTerm = terms[terms.length - 1];
                if (term.substring(0, lastTerm.length) === lastTerm) {
                    var results = new Array();
                    for (var i = 0; i < cache[lastTerm].length; i++) {
                        if (cache[lastTerm][i].label.toLowerCase().indexOf(term) !== -1) {
                            results.push(cache[lastTerm][i]);
                        }
                    }
                    response(results);
                    return;
                }
            }
            $.ajax({type: 'POST',
                    dataType: 'json',
                    url: '/get_search_data',
                    data: {q: term},
                    success: function (data) {
                        cacheNewTerm(term, data);
                        response(data);
                        return;
                    }
            });
    });
}

答案 1 :(得分:0)

如果有人想要在文本框中支持多个条目的版本,请参阅以下内容:

average = []
for member in df[df["Member"].unique():
    total_member = df[df["Member"] == member]["Total"].sum()
    for category in df["Category"].unique():
        total_category = df[(df["Member"]==member) & (df["Category"]==category)]["Total"]
        average.append(total_category/total_member)

df["Average"] = average