我在版本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
时,没有提供自动完成的结果。还有其他一些不起作用的词,它似乎遵循相同的模式,就像在找到部分单词时找不到完整的单词。知道导致这种行为的原因或解决方法吗?
我的猜测是远程数据源必须是另一种格式,但我找不到它的外观。预先输入页面上的所有示例都非常相似...
答案 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中有所体现。