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

Zuh*_*Ali 43 javascript autocomplete remote-server typeahead typeahead.js

在之前的版本中我可以做到:

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

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

Ben*_*ith 98

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

因此,您无法"定义远程而无需定义数据集函数".

这个使用远程数据源的例子(我正在查询TheMovieDb API,尝试搜索"外星人")可以在这里找到:

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

代码在这里:

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

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

// Instantiate the Typeahead UI
$('.typeahead').typeahead(null, {
    // Use 'value' as the displayKey because the filter function 
    // returns suggestions in a javascript object with a variable called 'value'
    displayKey: 'value',
    source: movies.ttAdapter()
});
Run Code Online (Sandbox Code Playgroud)

请注意过滤器功能如何允许您从非平凡的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 (17认同)
  • 在之前版本的typeahead.js中有Bloodhound的功能,它只是与jQuery插件结合使用.在v0.10中,我将两者分离,以允许不需要高级建议引擎的开发人员定义他们自己的数据源.因此,API并不那么简单 - 我希望在即将发布的版本中解决这个问题. (17认同)
  • Bloodhound引擎让一切都变得非常复杂.我只需要一个有效的自动完成功能,而不是一个Suggestion引擎.#OverEngineering. (9认同)
  • 我同意zuhaib,我认为Bloodhound jst更加强硬,并且有点臃肿. (7认同)
  • 官方[文档](https://github.com/twitter/typeahead.js/blob/master/doc/jquery_typeahead.md#datasets)提到我们可以使用自定义函数作为`source`.我想这会更简单,只要我们能够弄清楚如何. (6认同)
  • 对于一个简单的解决方案来说,这是多么垃圾的负载,Typeahead 确实让它变得臃肿。 (2认同)
  • 我很高兴和其他人在一起,他们认为这是相对简单的事情完全过于复杂。我有一个超级骗子建议远程源 - 我不需要我的客户端尝试做同样的事情。哦,好吧,回到 jQuery UI 自动完成。 (2认同)

小智 23

那么你可以这样做:

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

来源:使用没有Bloodhound的Typeahead.js


MER*_*ĞAN 9

如果你想使用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()
});
Run Code Online (Sandbox Code Playgroud)