我已经用远程数据源实现了Typeahead.js和Bloodhound,并且大多是按预期工作的。但是,我将打字机上的最小程度设置为2,虽然我可以在2个字符(和3个)后看到Ajax请求fire,但TypeAhead仅在4个字符或更多字符后提供建议。我的配置中是否缺少一些东西(我正在使用typeahead.bundle.min.js)。
var local_authorities = new Bloodhound({
datumTokenizer: function (datum) {
return Bloodhound.tokenizers.whitespace(datum.value);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
identify : function(datum) {
//console.log(datum);
return datum.value;
},
remote: {
url: "/addresses/autocomplete_local_authorities/%QUERY",
wildcard: '%QUERY',
filter: function (data) {
// Map the remote source JSON array to a JavaScript object array
return $.map(data.local_authorities, function (local_authority) {
return {
id: local_authority.id,
value: local_authority.name
};
});
}
}
});
$('.typeahead.local-authority').typeahead({
hint: true,
highlight: true,
minLength: 2,
}, {
limit: 8,
source: local_authorities,
displayKey: 'value',
})
.on('typeahead:selected', function (e, item) {
$('[name="local_authority_ids"').val(item.id);
});
谢谢。
一些调试表明,这是由函数async(suggestions)
引起的(行1719-1727):
function async(suggestions) {
suggestions = suggestions || [];
if (!canceled && rendered < that.limit) {
that.cancel = $.noop;
rendered += suggestions.length;
that._append(query, suggestions.slice(0, that.limit - rendered));
that.async && that.trigger("asyncReceived", query);
}
}
该错误是由在调用append
之前将rendered
设置为suggestions.length
引起的,因此,当血腥猎犬收到查询的5个或更多结果时,suggestions.slice(0, that.limit - rendered)
始终为空,因为标准limit
为5。
仅当远程端点返回少于limit
对象时,才会添加建议,这在您的情况下发生在4个字母和更多字母中。
由于我不是打字机和猎犬的开发人员,所以我不想(并且有时间)来弄清楚为什么它是这样实施的,但是如何解决了这一点,但是,快速解决方法是增加limit
。
必须在第二个配置对象中设置它,例如$( "#someId" ).typeahead( { ... }, {..., limit: 10, ...});
编辑:使用Typeahead/Bloodhoundv。0.11.1