【问题标题】:Typeahead Bloodhound autocomplete cant work with json objectsTypeahead Bloodhound 自动完成功能无法与 json 对象一起使用
【发布时间】:2017-01-14 23:28:54
【问题描述】:

拼命想弄清楚为什么自动完成不能与 json 对象一起工作

(function($){

    let $country = $('#country');

    let countries = new Bloodhound({
        datumTokenizer: Bloodhound.tokenizers.whitespace,
        queryTokenizer: Bloodhound.tokenizers.whitespace,
        prefetch: '../../data/countries.json'
    });

    $country.typeahead({
        name: 'countries',
        hint: true,
        highlight: true,
        minLength: 1
    },{
        source: countries,
        templates: {
            empty: ['No data'].join('\n'),
            suggestion: {
                function (data) {
                    return '<ul><li>'+data.name+'</li></ul>';
                }
            }
        }
    });

}(jQuery));

所有使用 json 的东西,比如 ["item1","item2","Item3"] 但不是 [{"name":"item1"},{"name":"item2"},{"name":"item3"}]

我的json是正确的,我什至试过用这个:http://twitter.github.io/typeahead.js/data/nba.json

使用关联数组时总是得到“无数据”。

也试过这个:

prefetch: {
            url: '../../data/countries.json',
            filter: function(list) {
                return $.map(list, function(item) {
                    return {
                        name: item.name,
                        code: item.code
                    };
                });
            }
        }

数据正在预取,但仍然没有建议。

当然,每次编辑后我都会清理本地存储。

也尝试使用 Handlebars

name: 'countries',
        source: countries,
        display: 'name',
        templates: {
            empty: ['No data'].join('\n'),
            suggestion: Handlebars.compile('<p><strong>{{name}}</strong></p>')
        }

【问题讨论】:

    标签: typeahead.js bloodhound


    【解决方案1】:

    好吧,我想通了,仍然不知道为什么......

    datumTokenizer: function (d) { return Bloodhound.tokenizers.whitespace(d.name); }
    

    代替

    datumTokenizer: Bloodhound.tokenizers.whitespace
    

    所以完整的工作代码是

    (function($){
    
        let $country = $('#country');
    
        let countries = new Bloodhound({
            datumTokenizer: function (d) { return Bloodhound.tokenizers.whitespace(d.name); },
            queryTokenizer: Bloodhound.tokenizers.whitespace,
            prefetch: {
                url: '../../data/countries.json',
                filter: function(list) {
                    return $.map(list, function(item) {
                        return {
                            name: item.name,
                            code: item.code
                        };
                    });
                },
                cache: true
            }
        });
    
        $country.typeahead({
            name: 'countries',
            hint: true,
            highlight: true,
            minLength: 1
        },{
            source: countries,
            display: function(data) { return data.name },
            templates: {
                empty: ['No data'].join('\n'),
                suggestion: function (data) {
                    return '<ul><li>'+data.name+'</li></ul>';
                }
            }
        });
    
    }(jQuery));
    

    【讨论】:

    • 这可能不是一个完整的解释。如果返回的 JSON 是一个字符串数组,那么引擎非常简单。否则,Bloodhound 建议引擎应该知道 datumTokenizer,以便它知道根据用户查询建议什么。在您的情况下,返回的 JSON 是一个对象数组。因此搜索可以基于名称或代码。您在 datumTokenizer 中提供此信息,以便相应地匹配建议。
    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 2018-01-10
    • 2018-03-08
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 2011-09-17
    • 2014-08-24
    相关资源
    最近更新 更多