Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Twitter Bootstrap Typeahead - Id & Label

I'm using Bootstrap 2.1.1 and jQuery 1.8.1 and trying to use Typeahead's functionality.

I try to display a label and use an id like a standard <select />

Here is my typeahead initialization:

$(':input.autocomplete').typeahead({     source: function (query, process) {         $('#autocompleteForm .query').val(query);         return $.get(             $('#autocompleteForm').attr('action')           , $('#autocompleteForm').serialize()           , function (data) {               return process(data);           }         );     } }); 

Here is the kind of JSON that I'm sending

[{"id":1,"label":"machin"},{"id":2,"label":"truc"}] 

How can I tell process() to display my labels and store the selected ID in another hidden field?

like image 960
Pierre de LESPINAY Avatar asked Sep 12 '12 14:09

Pierre de LESPINAY


2 Answers

There's a great tutorial here that explains how to do this: http://tatiyants.com/how-to-use-json-objects-with-twitter-bootstrap-typeahead/ (read my comment on that page if it hasn't been reflected yet in the main part of the post).

Based on that tutorial, and the JSON you provided, you can do something like this:

$(':input.autocomplete').typeahead({     source: function(query, process) {         objects = [];         map = {};         var data = [{"id":1,"label":"machin"},{"id":2,"label":"truc"}] // Or get your JSON dynamically and load it into this variable         $.each(data, function(i, object) {             map[object.label] = object;             objects.push(object.label);         });         process(objects);     },     updater: function(item) {         $('hiddenInputElement').val(map[item].id);         return item;     } });                     
like image 160
Gerbus Avatar answered Sep 23 '22 11:09

Gerbus


As of version 0.10.1 of Twitter Typeahead (https://github.com/twitter/typeahead.js), Id / Label is supported natively:

  $('input[name=address]').typeahead({         hint: false     }, {         source: function (query, cb) {             $.ajax({                 url: '/api/addresses?q=' + encodeURIComponent(query),                 dataType: 'json',                 cache: false,                 type: 'GET',                 success: function (response, textStatus, jqXHR) {                     cb(response.data);                 },                 error: function (jqXHR, textStatus, errorThrown) {                 }             });         },         name: 'addresses',         displayKey: 'text'     }).on('typeahead:selected', function (e, suggestion, name) {         window.location.href = '/' + suggestion.id;     }); 

If the example above, I'm passing an array of objects to the source callback (cb). By specifying displayKey: 'text', I'm telling the library to use the 'text' property for the auto-suggest. When the 'typeahead:select' callback is called, the second argument passed in (suggestion) contains the object that was selected.

like image 37
Johnny Oshika Avatar answered Sep 23 '22 11:09

Johnny Oshika