Dans les versions précédentes, je pouvais faire:
$('#search').typeahead({
name: 'Search',
remote: '/search?query=%QUERY'
});
Mais depuis le 0.10
update, typeahead.js nous demande de définir source
que je ne peux pas faire fonctionner. Comment définir remote sans avoir à définir une fonction de jeu de données?
Typeahead.js La version 0.10.0 utilise désormais un composant séparé appelé moteur de suggestion pour fournir les données de suggestion. Le moteur de suggestion livré avec Typeahead.js s’appelle Bloodhound .
Par conséquent, vous ne pouvez pas "définir à distance sans avoir à définir une fonction de jeu de données".
Vous trouverez un exemple de ceci avec une source de données distante (j'interroge l'API TheMovieDb, essayez de rechercher "Aliens", par exemple):
http://jsfiddle.net/Fresh/UkB7u/
Le code est ici:
// Instantiate the Bloodhound suggestion engine
var movies = new Bloodhound({
datumTokenizer: function (datum) {
return Bloodhound.tokenizers.whitespace(datum.value);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: 'http://api.themoviedb.org/3/search/movie?query=%QUERY&api_key=470fd2ec8853e25d2f8d86f685d2270e',
filter: function (movies) {
// Map the remote source JSON array to a JavaScript object array
return $.map(movies.results, function (movie) {
return {
value: movie.original_title
};
});
}
}
});
// Initialize the Bloodhound suggestion engine
movies.initialize();
// Instantiate the Typeahead UI
$('.typeahead').typeahead(null, {
// Use 'value' as the displayKey because the filter function
// returns suggestions in a javascript object with a variable called 'value'
displayKey: 'value',
source: movies.ttAdapter()
});
Notez que la fonction de filtrage vous permet de choisir ce que vous voulez utiliser comme suggestion de tête de frappe à partir d'une source de données JSON non triviale.
Pour ceux qui utilisent la nouvelle version de typeahead, un exemple de travail basé sur la question d'origine peut être trouvé ici:
http://jsfiddle.net/Fresh/bbzt9hcr/
En ce qui concerne Typeahead 0.10.0, la nouvelle version (0.11.1) présente les différences suivantes:
Eh bien, vous pouvez faire quelque chose comme:
$('input#keywords').typeahead({
highlight: true,
},
{
name: 'brands',
display: 'value',
source: function(query, syncResults, asyncResults) {
$.get('/search?q=' + query, function(data) {
asyncResults(data);
});
}
})
Si vous souhaitez utiliser ajax POST data à la place de données GET pour des appels ajax plus contrôlés, vous pouvez utiliser cette structure:
var meslekler = new Bloodhound({
datumTokenizer: function (d) {
return Bloodhound.tokenizers.whitespace(d.isim);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: 'my_url_with_or_without_%query_token.php',
ajax:{
type:"POST",
cache:false,
data:{
limit:5
},
beforeSend:function(jqXHR,settings){
settings.data+="&q="+$('.tt-input').typeahead('val');
},
complete:function(jqXHR,textStatus){
meslekler.clearRemoteCache();
}
}
}
});
meslekler.initialize();
$('.typeahead').typeahead(null, {
name:'meslekler',
displayKey: 'isim',
source: meslekler.ttAdapter()
});