4

我在我的搜索框中使用jQuery.autocomplete(1.02)并且我想要精确的字符串和子字符串匹配。我不关心(还没有!)关于数据库负载,我很高兴它每次击键都会触发一个查询并完全绕过缓存 - 我只是不想错过任何东西。

为此,我尝试设置cacheLength=1,这是允许的最小值,但自动完成功能拒绝为每个键触发 GET 请求。

searchbox          GET_request

   'a'       ->    http://localhost/service_search_request?q=a
   'ar'      ->    http://localhost/service_search_request?q=ar
   'ars'     ->    http://localhost/service_search_request?q=ars

相反,它发送了第一个和第三个而错过了第二个,给了我错误的“ar”结果:-/我已经清除了我的缓存和会话,但看起来某种缓存仍在进行中。AFAIK 我没有代理,我每次都在刷新。看起来这种行为可能来自 jQuery.autocomplete 本身。

所以我的问题是...

A)这看起来可能吗?即它是一个功能,还是一个错误?

B)如果是这样,有没有干净的方法?...

C)如果不是,您将使用什么自动完成功能?

自然D)不,你只是在错误地使用它,你冲洗!总是有可能的,实际上我更愿意花时间走这条路——假设它带有指向我未能找到/阅读的文档的链接!

干杯,

罗杰:)

4

5 回答 5

4

我想知道为什么cacheLength不起作用,但自动完成也有问题。恕我直言,其中有错误。但是,在options 列表中,您可以将matchSubset设置为 false。

编辑: 第 335 行附近的某处是一个名为“请求”的函数。您可以向其中添加一些调试消息,看看会发生什么:(注意:您需要安装firebug否则“控制台”将是未知的)

function request(term, success, failure) {

    console.debug("ac request...");

    if (!options.matchCase)
        term = term.toLowerCase();

    var data = cache.load(term);

    console.debug("ac request 1, loaded data from cache: " + data + " term: " + term);

    // recieve the cached data
    if (data && data.length) {
        success(term, data);
    // if an AJAX url has been supplied, try loading the data now
    } else if( (typeof options.url == "string") && (options.url.length > 0) ){

        console.debug("ac request 2, data is not in the cache, request it");

“flushCache”可以很容易地用于您可以附加/设置为选项的功能。如果后端可能有更多数据,我使用它来清除缓存:

formatItem: function (data,i,n,value){
    if(i === (this.max -1)){
        console.debug("flushCache");
        jQuery(this).flushCache();
    }

    return data[1] + " (" + data[0] + ")";
}
于 2009-04-15T07:48:36.297 回答
1

我有同样的问题。尽管我已将选项 cacheLength 设置为 1,但缓存不起作用。

使用您的解决方案在每个打印的术语之后调用 flushCache 函数。我无法使用:

if(i === (this.max -1)){

因为'i'在过滤后是例如1,但'this.max'仍然是25,因为原始后端查询导致25个返回行。

但是,此错误在键入包含瑞典语字符“å”、“ä”或“ö”的单词时出现。因此,兑现可能按预期工作,但不适用于这些特殊字符。

反正。我的解决方案是始终在 formatItem() 函数中调用 flushCache 控件:

function formatItem(row, position, n, term) {

    if($("#keywords-h").length > 0){
        $("#keywords-h").flushCache();
        }

        // format Item
        return "<span>" + row[0] + "</span>";
}

希望这对某人有所帮助,如果有人对特殊字符有同样的问题,请回复。

于 2009-07-09T11:52:42.090 回答
1

显然已经到了这 18 个月,但是

缓存长度:0

在对我有用的选项中。那么也许最新版本已经修复了这个错误?

于 2010-09-15T08:23:08.223 回答
1

这对我有用。

function requestData(q) {
   if (!options.matchCase) q = q.toLowerCase();

   //-- I turned off this line
   // var data = options.cacheLength ? loadFromCache(q) : null;

   //-- And added this line of code
   var data = null;
于 2011-05-17T10:17:11.540 回答
0

有一个选项可以禁用子集匹配,例如

$("#query").autocomplete(
    url,
    {
        matchSubset: false
    }
)
于 2011-11-22T22:32:57.257 回答