web-dev-qa-db-fra.com

Comment définissons-nous remote dans Typeahead.js?

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?

41
Zuhaib Ali

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.


Mise à jour pour Typeahead 0.11.1

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:

  • La fonction "Filtre" a été renommée "Transformer".
  • Pas besoin d'appeler initialize sur l'objet Bloodhound, ni d'appeler ttAdapter () lors de l'assignation à la source distante.
  • Maintenant, vous devez spécifier le caractère générique (par exemple% QUERY) dans le hachage des options distantes.
96
Ben Smith

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);
    });
  }
})

source: tilisation de Typeahead.js sans Bloodhound

21
Aqabawe

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()
});
9
MERT DOĞAN