我使用的是最新版本的typeahead.js(v0.11.1)。当对数据集值使用不同的id时,我观察到了奇怪的行为。
我创建了JSFiddle。这是js代码:
var ds = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
local: [{id: 1, name: "a b 1"}, {id: 2, name: "a b 2"}, {id: 3, name: "a"}],
identify: function(obj) { return obj.id; }
});
$('#go').typeahead(null, {
name: 'ds',
display: 'name',
source: ds
});
如果我更改了本地'的数据,现在预先输入可能会出现故障。以下只是一些例子:
将这些值中的一个用于本地' (注意第三个元素是以' 1'开头的随机数字):
[{id:1,姓名:" ab 1"},{id:2,姓名:" ab 2"},{id:15,姓名:&#34 ;一个"}]
[{id:1,姓名:" ab 1"},{id:2,姓名:" ab 2"},{id:1849,姓名:&#34 ;一个"}]
现在,当我进入文本框:" a b"时,预计会提前输入" a b 1"和" a b 2",但事实上它只建议" a b 1"。
这可以通过以下方法之一解决:
更改' id'第三个元素的属性为不以' 1'开头的值。例如:
[{id:1,姓名:" ab 1"},{id:2,姓名:" ab 2"},{id:23,姓名:&#34 ;一个"}]
更改'名称'第三个元素的属性为不以' a'开头的值。例如:
[{id:1,姓名:" ab 1"},{id:2,姓名:" ab 2"},{id:15,姓名:&#34 ; S"}]
删除'识别' Bloodhound构造函数对象的属性。
还有什么,如果我使用大于2的数字作为第一个元素的id,就像这样:
[{id:3,姓名:" ab 1"},{id:2,姓名:" ab 2"},{id:15,姓名:&#34 ;一个"}]
现在当我进入" b"进入文本框,没有任何建议!
答案 0 :(得分:5)
回答我自己的问题。是的,猎犬有一个错误。 SearchIndex.getIntersection()函数未正确实现。您可以取出此功能并按以下方式进行测试:
getIntersection([1,2,15],[1,2])
它应该返回[1,2]作为结果,但实际上它返回[1]。这是因为它错误地使用sort()函数来排序数字。根据w3schools:
默认情况下,sort()方法将值排序为字符串 按字母顺序排列。
这适用于字符串(" Apple"来自" Banana")。然而, 如果数字按字符串排序," 25"大于" 100",因为 " 2"大于" 1"。
因此可以通过更改以下两行来修复此功能:
arrayA = arrayA.sort();
arrayB = arrayB.sort();
成:
arrayA = arrayA.sort(function(a, b){return a-b});
arrayB = arrayB.sort(function(a, b){return a-b});
花了我一天才发现:(