Bloodhound 远程查询有效但没有任何建议
Bloodhound remote queries works but doesn't suggest anything
我正在使用 bloodhound 作为 typeahead 的建议引擎。
问题是当我在 bloodhound 中使用远程源时。它进行查询并获取结果,但是当我搜索结果时,没有返回任何内容。
更具体地说,这段代码工作得很好:
categoryEngine = new Bloodhound({
queryTokenizer: Bloodhound.tokenizers.whitespace,
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('title'),
local: [{
id: 1,
title: 'Pizza'
},
{
id: 2,
title: 'Pasta'
}
]
});
categoryEngine.initialize();
categoryEngine.search('Pi', function(s) {
console.log('food='+JSON.stringify(s));
});
并在控制台中记录 food=[{"id":1,"title":"Pizza"}]
,这是正确的。
但是这个带有远程源:
categoryEngine = new Bloodhound({
queryTokenizer: Bloodhound.tokenizers.whitespace,
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('title'),
remote: {
url: '/complete/category_title/%QUERY',
wildcard: '%QUERY'
}
});
categoryEngine.initialize();
categoryEngine.search('Pi', function(s) {
console.log('food='+JSON.stringify(s));
});
向服务器发出请求:
GET /complete/category_title/Pi HTTP/1.1
Host: XXXXX
Connection: keep-alive
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
Referer: YYYYY
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,fa;q=0.6
Cookie: PHPSESSID=ZZZZZ
并接受以下回复:
HTTP/1.1 200 OK
Host: XXXXX
Connection: close
X-Powered-By: PHP/5.6.8
Cache-Control: no-cache
Date: Sun, 10 May 2015 14:24:22 GMT
Content-Type: application/json
[{"id":13,"title":"Pizza"}]
这似乎也是正确的,但是 search
方法不起作用并且调试行在控制台中打印 food=[]
因为它 returns 没有结果。
我正在使用这些库:
- jQuery v1.11.2
- jQuery 迁移 v1.2.1
- jQuery UI v1.11.2
- Bootstrap v3.3.1
- Typeahead v0.11.1
看起来,问题是 Bloodhound.search returns 异步(远程)导致第二个回调(第三个参数)(Bloodhound.search)。
您应该将代码更改为:
var cb = function(s) {console.log('food='+JSON.stringify(s));};
categoryEngine.search('Pi', cb, cb);
我正在使用 bloodhound 作为 typeahead 的建议引擎。
问题是当我在 bloodhound 中使用远程源时。它进行查询并获取结果,但是当我搜索结果时,没有返回任何内容。
更具体地说,这段代码工作得很好:
categoryEngine = new Bloodhound({
queryTokenizer: Bloodhound.tokenizers.whitespace,
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('title'),
local: [{
id: 1,
title: 'Pizza'
},
{
id: 2,
title: 'Pasta'
}
]
});
categoryEngine.initialize();
categoryEngine.search('Pi', function(s) {
console.log('food='+JSON.stringify(s));
});
并在控制台中记录 food=[{"id":1,"title":"Pizza"}]
,这是正确的。
但是这个带有远程源:
categoryEngine = new Bloodhound({
queryTokenizer: Bloodhound.tokenizers.whitespace,
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('title'),
remote: {
url: '/complete/category_title/%QUERY',
wildcard: '%QUERY'
}
});
categoryEngine.initialize();
categoryEngine.search('Pi', function(s) {
console.log('food='+JSON.stringify(s));
});
向服务器发出请求:
GET /complete/category_title/Pi HTTP/1.1
Host: XXXXX
Connection: keep-alive
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
Referer: YYYYY
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,fa;q=0.6
Cookie: PHPSESSID=ZZZZZ
并接受以下回复:
HTTP/1.1 200 OK
Host: XXXXX
Connection: close
X-Powered-By: PHP/5.6.8
Cache-Control: no-cache
Date: Sun, 10 May 2015 14:24:22 GMT
Content-Type: application/json
[{"id":13,"title":"Pizza"}]
这似乎也是正确的,但是 search
方法不起作用并且调试行在控制台中打印 food=[]
因为它 returns 没有结果。
我正在使用这些库:
- jQuery v1.11.2
- jQuery 迁移 v1.2.1
- jQuery UI v1.11.2
- Bootstrap v3.3.1
- Typeahead v0.11.1
看起来,问题是 Bloodhound.search returns 异步(远程)导致第二个回调(第三个参数)(Bloodhound.search)。 您应该将代码更改为:
var cb = function(s) {console.log('food='+JSON.stringify(s));};
categoryEngine.search('Pi', cb, cb);