How to get both id and value from typeahead.js when selecting a suggestion?
I have a json as follows:
[
    {id:1, name:'paul'}, 
    {id:2, name:'jim'}, 
    {id:3, name:'tom'}, 
    {id:4, name:'medor'}, 
    {id:5, name:'janzy'}
]
and i created Bloodhound object as follows:
var bh = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    prefetch: '//localhost/data/names.json',
    identify: function(datum){
        return datum.id;    
    }
});
and i instantiated typeahead as follows:
$('#name').typeahead({"highlight":true}, {
    "name":"name",
    "source":bh,
    "display":"value",
    "limit":10
})
I want to be able to get the id when i submit my form. When i submit the following example, i obtain only the name attribute.
i tried to obtain the id via javascript as follows:
$('#name').bind('typeahead:select', function(ev, suggestion){
    console.log(suggestion);
})
but suggestion contains an object with only text value which i selected
You have a couple of options.
I think overriding the identity function may get you what you need.  Something like this might get you there:
identify: function(datum){
        return { id: datum.id, value: data.name};    
    }
I use remote for my actual production code and use the filter option to return the display value as well as the key value.
It looks something like this:
remote: {
        url: '/some/url',
        filter: function (data) {
            if (data) {
                return $.map(data, function (object) {
                    return { id: object.id, value: object.name};
                });
            } else {
                return {};
            }
        }
    }
You can also try using the transform function as part of prefetch, which would look something like this:
prefetch: {
        url: '/some/url',
        transform: function (response) {
            if (response) {
                return $.map(response, function (object) {
                    return { id: object.id, value: object.name};
                });
            } else {
                return {};
            }
        }
    }
The documentation (available here) is somewhat helpful, but doesn't do much to show more complicated examples.
I also experimented with the examples (typeahead examples) quite a bit before I finally found my answers.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With