Обойти все кэширование на jQuery.autocomplete (1.02) - PullRequest
4 голосов
/ 15 апреля 2009

Я использую 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) Нет, вы просто используете это неправильно, придурок! всегда есть возможность, и действительно, я бы предпочел, чтобы я потратил время на этот путь - если предположить, что он связан к документам, которые мне не удалось найти / прочитать!

Приветствия

Роджер:)

Ответы [ 5 ]

4 голосов
/ 15 апреля 2009

Интересно, почему cacheLength не работает, но также имел проблемы с автозаполнением. ИМХО, в этом есть ошибки. Однако в списке параметров есть matchSubset , который можно установить на false.

EDIT: где-то около строки 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] + ")";
}
1 голос
/ 17 мая 2011

Это сработало для меня.

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;
1 голос
/ 15 сентября 2010

Очевидно пришли к этому 18 месяцев, но

cacheLength: 0

в настройках у меня сработало. Так, может быть, в последней версии исправлена ​​ошибка?

1 голос
/ 09 июля 2009

У меня такая же проблема. Кеширование не работает, хотя я установил опцию cacheLength на 1.

С вашим решением вызывать функцию flushCache после каждого напечатанного термина. Я не мог использовать:

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

, поскольку 'i' было, например, 1 после фильтрации, но 'this.max' по-прежнему равно 25, поскольку исходный внутренний запрос привел к 25 возвращенным строкам.

Однако , эта ошибка ONLY появляется при наборе слов, содержащих шведские символы «å», «ä» или «ö». Так что, возможно, обналичивание работает, как и ожидалось, но не с этими специальными символами.

Так или иначе. решение для меня заключалось в том, чтобы всегда вызывать элемент управления flushCache в функции formatItem ():

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

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

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

Надеюсь, это кому-нибудь поможет, и если у кого-то возникли те же проблемы со специальными символами, пожалуйста, напишите ответ.

0 голосов
/ 23 ноября 2011

Существует возможность отключить сопоставление подмножеств, например,

$("#query").autocomplete(
    url,
    {
        matchSubset: false
    }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...