Twitter Typeahead.js how to return all matched elements within a string

前端 未结 1 1734
后悔当初
后悔当初 2020-12-05 19:21

By default twitter typeahead.js returns only elements matched in the begining of a string, for example:

source: [\'type\',\'typeahead\',\'ahead\']

query: \'t

相关标签:
1条回答
  • 2020-12-05 19:24

    I found a solution... the problem was that I was so used to bootstrap2 typeahead that I wasn't understanding the datumTokenizer thing. If someone else find it hard to understand, I will put a little description below:

    queryTokenizer: array of words you are querying, if you query for 'test abcd' it will transform the string into ['test','abcd'] and than look for matches with those two words.

    datumTokenizer : array of words it will be matched with queryTokenizer. Each item from your JSON will have a set of words to be matched.

    So if you have a source:

    ['good test','bad test']

    and query for 'est'. You need to make datumTokenizer return an array containing 'est' , something like:

    ['good','test','ood','od','test', 'est', 'st'] for the first item

    ['bad','ad','test', 'est', 'st'] for the second item

    Bellow is the code I wrote, I don't know if its the optimal thing for it, but I think it will help anyway:

    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
        }
    });
    
    0 讨论(0)
提交回复
热议问题