Twitter Typeahead远程未完成某些查询

时间:2015-10-30 13:18:05

标签: typeahead.js twitter-typeahead

我在版本0.11.1中使用Twitter Typeahead。现在我试图让远程工作正常,但不知怎的,我觉得我的行为很奇怪。

这是带有本地数组的工作代码:

var localArray = [{"value":"test0"},{"value":"test1"},{"value":"test2"},{"value":"test3"},{"value":"test4"}];
var myds = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    local: localArray
});
$(function () {
    $("#my-input").typeahead({},
    {
        name: 'ds1',
        source: myds,
        display: 'value'
    });
});

现在我尝试设置远程数据。我所做的只是将本地更改为远程并提供URL并添加查询参数。它将提供与localArray完全相同的结构和数据(它当前忽略查询并始终提供localArray的内容以便对其进行测试)。我在Chrome开发者工具中检查了查询是否实际执行并返回localArray的内容:

var myds = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    remote: {
        url: '/autocomplete?query=%QUERY',
        wildcard: '%QUERY'
    }    
});
$(function () {
    $("#my-input").typeahead({},
    {
        name: 'ds1',
        source: myds,
        display: 'value'
    });
});

在搜索test时,这不起作用。搜索tes时,我仍然会收到结果,但是当我搜索test时,没有提供自动完成的结果。还有其他一些不起作用的词,它似乎遵循相同的模式,就像在找到部分单词时找不到完整的单词。知道导致这种行为的原因或解决方法吗?

我的猜测是远程数据源必须是另一种格式,但我找不到它的外观。预先输入页面上的所有示例都非常相似...

1 个答案:

答案 0 :(得分:3)

您在输入中遇到bug。当处理与typeahead中声明的限制相同或小于的限制结果集时,它会导致奇怪的行为(默认限制为5)。不幸的是,主要的先行回购不再被维护,所以你要么必须使用修复问题的PR或自己编辑代码。幸运的是,修复只是向下移动一行代码。

在已编译的包或demoController.$inject = ["ngTableParams", "ngTableSimpleList", "$scope"]; 中找到此代码块并将其更改为:

src/typeahead/dataset.js

所有这一切都是移动function async(suggestions) { suggestions = suggestions || []; if (!canceled && rendered < that.limit) { that.cancel = $.noop; that._append(query, suggestions.slice(0, that.limit - rendered)); rendered += suggestions.length; that.async && that.trigger("asyncReceived", query); } } 低于 rendered += suggestions.length;;

这在this PR中有所体现。