Bypass todo cache em jQuery.autocomplete (1,02)
-
09-09-2019 - |
Pergunta
Eu estou usando jQuery.autocomplete (1,02) na minha caixa de pesquisa e quero exata ??strong> string e substring correspondente. Eu não me importo (ainda!) Sobre a carga de banco de dados, eu estou feliz por ele para disparar uma consulta todas as teclas e ignorar o cache inteiramente -. Eu só não quero que nada perdeu
Para este fim eu tenho configuração tentou cacheLength = 1 , o mínimo permitido, mas a função autocomplete se recusa a disparar uma solicitação GET para cada tecla para cima.
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
Em vez disso, ele envia o primeiro eo terceiro e perde o segundo, dando-me os resultados errados para 'ar': - / Eu limpei a cache e sessões, mas parece que algum tipo de cache ainda está em curso. AFAIK Não tenho proxy acontecendo e eu estou cada vez-refrescante mudança. Parece provável, então, que este comportamento é de si jQuery.autocomplete.
Então, minhas perguntas são ...
A) Isto parece provável? ou seja, é uma característica, ou talvez um bug?
B) Se assim for, há uma maneira limpa em torno dele? ...
C) Se não, o autocomplete você usaria em vez disso?
Naturalmente D) Não, você está apenas usando-lo incorretamente você douche é sempre uma possibilidade, e na verdade o que eu prefiro ter tempo gasto indo por este caminho - supondo que ele vem com um link para os docs Eu não conseguiram localizar / ler!
Cheers,
Roger:)
Solução
Eu me pergunto por cacheLength não trabalho, mas teve problemas com autocomplete também. IMHO, há erros na mesma. No entanto, na href="http://docs.jquery.com/Plugins/Autocomplete/autocomplete#url_or_dataoptions" rel="nofollow lista de opções , há um matchSubset você pode definir como falsa.
EDIT: em algum lugar em torno da linha 335 é uma função chamada "pedido". Você pode adicionar algumas mensagens de depuração para ele, para ver o que acontece: (Nota: você precisa firebug instalado ou "console" será desconhecido)
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" pode facilmente ser usado na função você pode anexar / set como opções. Eu usei isso, para limpar o cache, se poderia haver mais dados no backend:
formatItem: function (data,i,n,value){
if(i === (this.max -1)){
console.debug("flushCache");
jQuery(this).flushCache();
}
return data[1] + " (" + data[0] + ")";
}
Outras dicas
Estou tendo o mesmo problema. Cache não funciona apesar de eu ter definido o cacheLength opção de 1.
Com a sua solução para chamar a função flushCache depois de cada termo impresso ele funciona. Eu não poderia usar o:
if(i === (this.max -1)){
desde 'i' foi por exemplo 1 após a filtragem, mas 'this.max' ainda 25 como a consulta backend originais resultou em 25 linhas retornadas.
No entanto , este bug SOMENTE aparece quando as palavras de digitação que contêm os caracteres sueco 'a', 'a' ou 'o'. Então, talvez a descontar funciona como esperado, mas não com esses caracteres especiais.
De qualquer forma. a solução para mim foi sempre chamar o controle flushCache na função formatItem ():
function formatItem(row, position, n, term) {
if($("#keywords-h").length > 0){
$("#keywords-h").flushCache();
}
// format Item
return "<span>" + row[0] + "</span>";
}
Espero que isso ajude alguém e se alguém está a ter os mesmos problemas com caracteres especiais, por favor postar uma resposta.
têm, obviamente, vir a este 18 meses sobre, mas
cacheLength: 0
nas opções trabalharam para mim. Então, talvez mais recente lançamento fixou o bug?
Isso funcionou para mim.
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;
Há uma opção para desativar a correspondência subconjunto por exemplo.
$("#query").autocomplete(
url,
{
matchSubset: false
}
)