【问题标题】:Typeahead/Bloodhound only returns first search results and not new search?Typeahead/Bloodhound 只返回第一个搜索结果而不是新搜索?
【发布时间】:2021-06-28 10:03:00
【问题描述】:

我已经使用 Bloodhound 实现了 Typeahead 以获取远程 JSON 数据,它可以工作,但是当我删除输入内容并键入其他内容时,会出现相同的结果。我在 chrome 开发工具中检查了网络,只有一个请求,即使我删除并再次开始输入,也没有新请求。我该如何解决? keyup 应该有新的请求了?

   var articles = new Bloodhound({
            datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
            queryTokenizer: Bloodhound.tokenizers.whitespace,
            remote: {
                url: '../fetch-article',
                wildcard: '%QUERY'
            }
        });


        $('#search-article .typeahead').typeahead(null, {
            name: 'articles',
            display: 'value',
            highlight: true,
            limit: Infinity,
            minLength: 3,
            source: articles,
            templates: {
                empty: [
                '<div class="empty-message">',
                    'Article not found',
                '</div>'
                ].join('\n'),
                suggestion: function(data) {
                    return '<div class="tt-suggest-page">' + data.title + '<br><a href="../copyright/' + data.slug + '">Read More</a></div>';
                }
            }
        });

【问题讨论】:

    标签: typeahead.js


    【解决方案1】:

    Bloodhound 将第一次命中的结果缓存到远程。然后它尝试仅在缓存数据中搜索您在文本字段中键入的第二个查询,因此不会再次点击远程。您可以告诉 Bloodhound 不要使用缓存进行搜索。这可以使用以下配置来完成:

    var articles = new Bloodhound({
        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
        queryTokenizer: Bloodhound.tokenizers.whitespace,
        remote: {
            url: '../fetch-article',
            wildcard: '%QUERY',
            cache: false        //set cache to false
        }
    });
    

    参考:https://github.com/twitter/typeahead.js/issues/1525

    【讨论】:

      【解决方案2】:

      Bloodhound Typeahead 默认缓存远程调用,我们必须将缓存配置为 false 才能再次调用远程 URL。

      cache – 如果为 false,则不会尝试读取或写入本地存储,并且始终会在初始化时从 url 加载预取数据。默认为真。

      您可以在此处查看文档-https://github.com/twitter/typeahead.js/blob/master/doc/bloodhound.md#prefetch

      【讨论】: