javascript - template - Twitter Typeahead.js cómo devolver todos los elementos coincidentes dentro de una cadena
typeahead template (1)
Encontré una solución ... el problema era que estaba tan acostumbrado a bootstrap2 typeahead que no entendía el tema datumTokenizer
. Si a alguien más le resulta difícil de entender, a continuación le haré una pequeña descripción:
queryTokenizer: matriz de palabras que está consultando, si consulta por ''test abcd'', transformará la cadena en [''test'', ''abcd''] y luego buscará coincidencias con esas dos palabras.
datumTokenizer: conjunto de palabras que se combinarán con queryTokenizer. Cada elemento de su JSON tendrá un conjunto de palabras que deben coincidir.
Así que si tienes una fuente:
[''Buena prueba'', ''mala prueba'']
y consulta por ''est''. Debe hacer que datumTokenizer devuelva una matriz que contenga ''est'', algo como:
[''good'', ''test'', ''ood'', ''od'', ''test'', ''est'', ''st''] para el primer elemento
[''bad'', ''ad'', ''test'', ''est'', ''st''] para el segundo elemento
A continuación se muestra el código que escribí, no sé si es lo mejor para él, pero creo que ayudará de todos modos:
new Bloodhound({
datumTokenizer: function(d) {
var test = Bloodhound.tokenizers.whitespace(d.value);
$.each(test,function(k,v){
i = 0;
while( (i+1) < v.length ){
test.push(v.substr(i,v.length));
i++;
}
})
return test;
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
limit: 10,
prefetch: {
url: ''/lista.json'',
ttl: 10000
}
});
Por defecto, twitter typeahead.js solo devuelve elementos que coinciden al principio de una cadena, por ejemplo:
fuente: [''tipo'', ''typeahead'', ''adelante'']
Tipo de consulta''
devuelve: ''tipo'' y ''typeahead''
-
consulta: ''adelante''
devuelve: ''adelante''
Quiero que regrese ''adelante'' y ''typeahead''
mi código:
var clients = new Bloodhound({
datumTokenizer: function(d) { return Bloodhound.tokenizers.whitespace(d.value); },
queryTokenizer: Bloodhound.tokenizers.whitespace,
limit: 10,
prefetch: {
url: ''/clients.json'',
filter: function(list) {
return $.map(list, function(value) { return { name: value }; });
}
}
});
clients.initialize();
$(''.client'').typeahead(null, {
displayKey: ''value'',
source: clients.ttAdapter(),
minLength: 1,
});
Ya hay una pregunta al respecto, pero no entendí la respuesta.