我有以下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);
}
});
});
}
答案 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