如何让 Bloodhound 的 Typeahead 与 JSON 响应一起工作?
How to get Typeahead with Bloodhound to work with a JSON response?
我想弄清楚如何让 typeahead.js with bloodhound.js 与我的 JSON 结构一起工作。我想要的是预加载 JSON 对象的预输入功能,该对象保留在范围内。以下是部分:
Data/All
url returns 具有以下结构的 application/json
响应:
[{"Id":1010,"Name":"Andijvie ", "Category":"Blad- en stengel gewassen"},{"Id":1020,"Name":"Broccoli ","Category":"Blad- en stengel gewassen", (...)]
此外,我的观点是:
<div id="select-crop">
<input class="typeahead" type="text" placeholder="Select crop">
</div>
在JavaScript中:
var cropsSuggestionEngine = new Bloodhound({
datumTokenizer: function (datum) {
return Bloodhound.tokenizers.whitespace(datum.Name);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
prefetch: {
url: "/Crop/All",
filter: function (data) {
return $.map(data, function(crop) {
return {
value: crop.Name
};
});
}
}
});
$(function() {
cropsSuggestionEngine.initialize();
$('#select-crop .typeahead').typeahead({
hint: true,
highlight: true,
minLength: 1
}, {
name: 'Crops',
displayKey: 'Name',
source: cropsSuggestionEngine.ttAdapter(),
templates: {
empty: [
'<div class="empty-message">',
'unable to find any results that match the current query',
'</div>'
].join('\n'),
suggestion: Handlebars.compile('<p><strong>{{name}}</strong></p>')
}
});
});
当在预输入字段中输入内容时,它总是会显示没有任何结果与查询匹配的消息。当我通过 FireBug 查看 DOM 时,我看到数据由一个带有空元素的长列表组成。
我希望有 bloodhound/typeahead 经验的人能给我指出正确的方向。我现在似乎无法弄清楚。谢谢。
预先输入在预取数据集中的建议对象中找不到任何 'Name' 个键。
当你定义 typeahead 时,你是说 'displayKey' 键是 "Name"。但是当你完善数据集时,你的过滤函数(在 cropSuggestionEngine 中)return 是一个 json 对象的数组,如下所示:
[{value: "Andijvie "},{value: "Broccoli "}, ...]
所以没有任何 "Name" 键。
如果将过滤器函数更改为 return { Name: crop.Name }
,您的代码可以正常工作。
filter: function(data) {
return $.map(data, function(crop) {
return {
Name: crop.Name
};
});
}
希望对您有所帮助!
我想弄清楚如何让 typeahead.js with bloodhound.js 与我的 JSON 结构一起工作。我想要的是预加载 JSON 对象的预输入功能,该对象保留在范围内。以下是部分:
Data/All
url returns 具有以下结构的 application/json
响应:
[{"Id":1010,"Name":"Andijvie ", "Category":"Blad- en stengel gewassen"},{"Id":1020,"Name":"Broccoli ","Category":"Blad- en stengel gewassen", (...)]
此外,我的观点是:
<div id="select-crop">
<input class="typeahead" type="text" placeholder="Select crop">
</div>
在JavaScript中:
var cropsSuggestionEngine = new Bloodhound({
datumTokenizer: function (datum) {
return Bloodhound.tokenizers.whitespace(datum.Name);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
prefetch: {
url: "/Crop/All",
filter: function (data) {
return $.map(data, function(crop) {
return {
value: crop.Name
};
});
}
}
});
$(function() {
cropsSuggestionEngine.initialize();
$('#select-crop .typeahead').typeahead({
hint: true,
highlight: true,
minLength: 1
}, {
name: 'Crops',
displayKey: 'Name',
source: cropsSuggestionEngine.ttAdapter(),
templates: {
empty: [
'<div class="empty-message">',
'unable to find any results that match the current query',
'</div>'
].join('\n'),
suggestion: Handlebars.compile('<p><strong>{{name}}</strong></p>')
}
});
});
当在预输入字段中输入内容时,它总是会显示没有任何结果与查询匹配的消息。当我通过 FireBug 查看 DOM 时,我看到数据由一个带有空元素的长列表组成。
我希望有 bloodhound/typeahead 经验的人能给我指出正确的方向。我现在似乎无法弄清楚。谢谢。
预先输入在预取数据集中的建议对象中找不到任何 'Name' 个键。
当你定义 typeahead 时,你是说 'displayKey' 键是 "Name"。但是当你完善数据集时,你的过滤函数(在 cropSuggestionEngine 中)return 是一个 json 对象的数组,如下所示:
[{value: "Andijvie "},{value: "Broccoli "}, ...]
所以没有任何 "Name" 键。
如果将过滤器函数更改为 return { Name: crop.Name }
,您的代码可以正常工作。
filter: function(data) {
return $.map(data, function(crop) {
return {
Name: crop.Name
};
});
}
希望对您有所帮助!