我们如何在 Typeahead.js 中设置远程?

IT技术 javascript autocomplete remote-server typeahead typeahead.js
2021-01-15 07:35:45

在以前的版本中,我可以这样做:

$('#search').typeahead({
  name: 'Search',
  remote: '/search?query=%QUERY'
});

但是自从0.10更新以来,typeahead.js 要求我们定义source哪些我不能工作。如何在不必定义数据集函数的情况下定义远程?

3个回答

Typeahead.js 0.10.0 版现在使用一个称为建议引擎的单独组件来提供建议数据。Typeahead.js 附带的建议引擎称为Bloodhound

因此,您不能“定义远程而不必定义数据集函数”。

可以在此处找到使用远程数据源的示例(我正在查询 TheMovieDb API,例如尝试搜索“Aliens”):

http://jsfiddle.net/Fresh/UkB7u/

代码在这里:

// Instantiate the Bloodhound suggestion engine
const movies = new Bloodhound({
  datumTokenizer: datum => Bloodhound.tokenizers.whitespace(datum.value),
  queryTokenizer: Bloodhound.tokenizers.whitespace,
  remote: {
    url: 'http://api.themoviedb.org/3/search/movie?query=%QUERY&api_key=f22e6ce68f5e5002e71c20bcba477e7d',
    // Map the remote source JSON array to a JavaScript object array
    filter: movies => $.map(movies.results, movie => ({
      value: movie.original_title
    }))
  }
});

// Initialize the Bloodhound suggestion engine
movies.initialize();

// Instantiate the Typeahead UI
$('.typeahead').typeahead(null, {
  displayKey: 'value',
  source: movies.ttAdapter()
});

请注意过滤器功能如何让您从重要的 JSON 数据源中选择要用作预先输入建议的内容。


Typeahead 0.11.1 的更新

对于那些使用较新版本的 typeahead 的人,可以在此处找到基于原始问题的工作示例:

http://jsfiddle.net/Fresh/bbzt9hcr/

相对于 Typeahead 0.10.0,新版本 (0.11.1) 有以下区别:

  • “过滤器”功能已重命名为“转换”。
  • 无需在 Bloodhound 对象上调用 initialize,也无需在将其分配给远程源时调用 ttAdapter()。
  • 现在需要在远程选项散列中指定通配符(例如 %QUERY)。
这很可悲,因为提供的功能bloodhound远远超出了我的需要。它曾经非常简单,直到 0.9.3
2021-03-16 07:35:45
Bloodhound 的功能在之前的 typeahead.js 版本中就有,它只是与 jQuery 插件结合使用。在 v0.10 中,我将两者解耦,以允许不需要高级建议引擎的开发人员定义自己的数据源。因此,API 并不那么简单——我希望在即将发布的版本中解决这个问题。
2021-03-24 07:35:45
官方文档提到我们可以使用自定义函数作为source. 我想这会更简单,前提是我们能够弄清楚如何。
2021-03-25 07:35:45
我同意 zuhaib 的观点,我认为 Bloodhound jst 使输入更难,而且有点臃肿。
2021-03-30 07:35:45
Bloodhound 引擎让一切变得超级复杂。我只需要一个有效的自动完成功能,而不是一个建议引擎。#过度工程。
2021-04-06 07:35:45

好吧,您可以执行以下操作:

$('input#keywords').typeahead({
    highlight: true,
},
{
  name: 'brands',
  display: 'value',
  source: function(query, syncResults, asyncResults) {
    $.get('/search?q=' + query, function(data) {
      asyncResults(data);
    });
  }
})

来源:在没有 Bloodhound 的情况下使用 Typeahead.js

Typescript 版本需要 asyncResults!(data); (感叹号)
2021-03-16 07:35:45
干杯! 最后一个例子如何在没有猎犬的情况下做到这一点
2021-04-03 07:35:45
现在你可以做相反的事情并展示如何做到这一点(更新查询 url)而无需提前输入,即只需要 Bloodhoudhnd
2021-04-03 07:35:45

如果您想使用 ajax POST 数据而不是 GET 数据来进行更多控制的 ajax 调用,您可以使用以下结构:

var meslekler = new Bloodhound({
    datumTokenizer: function (d) {
            return Bloodhound.tokenizers.whitespace(d.isim);
        },
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    remote: {
        url: 'my_url_with_or_without_%query_token.php',
        ajax:{
            type:"POST",
            cache:false,
            data:{
                limit:5
            },
            beforeSend:function(jqXHR,settings){
                settings.data+="&q="+$('.tt-input').typeahead('val');
            },
            complete:function(jqXHR,textStatus){
            meslekler.clearRemoteCache();
            }
        }
    }
});
meslekler.initialize();
$('.typeahead').typeahead(null, {
    name:'meslekler',
    displayKey: 'isim',
    source: meslekler.ttAdapter()
});
对象不支持属性或方法“clearRemoteCache”
2021-03-15 07:35:45
它可以在最新版本中更改。我去年使用过这个功能,它运行没有错误。
2021-03-22 07:35:45