Twitter Typeahead.js如何返回字符串中所有匹配的元素

18

默认情况下,Twitter Typeahead.js 仅返回与字符串开头匹配的元素,例如:

源代码:['type','typeahead','ahead']

查询:'type'

返回结果:'type' 和 'typeahead'

--

查询:'ahead'

返回结果:'ahead'

我希望它返回 'ahead' 和 'typeahead'

我的代码:

var clients = new Bloodhound({
    datumTokenizer: function(d) { return Bloodhound.tokenizers.whitespace(d.value); },
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    limit: 10,
    prefetch: {
        url: '/clients.json',
        filter: function(list) {
            return $.map(list, function(value) { return { name: value }; });
        }
    }
});

clients.initialize();

$('.client').typeahead(null, {
    displayKey: 'value',
    source: clients.ttAdapter(),
    minLength: 1,
});

已经有一个关于此问题的提问,但是我不理解那个答案。

1个回答

43

我找到了一个解决方案...问题是我太习惯使用Bootstrap2 的typeahead了,所以我不理解 datumTokenizer 这个东西。如果有人觉得难以理解,我会在下面提供一点描述:

queryTokenizer:你正在查询的单词数组,如果你查询“test abcd”,它将把字符串转换为['test','abcd'],然后查找这两个单词相匹配的内容。

datumTokenizer:与queryTokenizer匹配的单词数组。您的JSON中的每个项都有一组要匹配的单词。

因此,如果您有来源:

['good test','bad test']

并查询“est”。您需要使 datumTokenizer 返回一个包含“est”的数组,类似于:

第一个项目:['good','test','ood','od','test','est','st']

第二个项目:['bad','ad','test','est','st']

下面是我编写的代码,我不知道它是否最优,但我认为它仍然会有所帮助:

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

1
考虑使用严格模式,变量 i 的初始值应为 0。否则,其初始值应为 1。 - Matt Jensen
1
对我有用!谢谢! - jlars62
1
我们如何在同一dataNumTokenizer中对多个列进行搜索? - Ajay Beniwal
谢谢,我在文档中查找了,但是我不理解datumTokenizer和queryTokenizer是什么。 - damuz91
4
无需与代码作斗争,只需将 d.value 更改为 d.(您想搜索的任何字段)。 - Aaron Gong
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接