The*_*ude 6 javascript jquery typeahead typeahead.js bloodhound
我有一个问题,当用户联合会话到期时,Typeahead会停止工作.我希望能够在Typeahead的"远程"调用失败时执行操作.具体如何处理Typeahead?在典型的ajax调用中是否会出现某种类似"错误"的回调?这是我目前的代码:
var hints = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace("value"),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: "/ProjectAssociation/CountryLookup?query=%QUERY",
wildcard: "%QUERY"
}
});
$("#assocStoragesSelection").typeahead(null, {
name: "nations",
limit: 90,
valueKey: "ShortCode",
displayKey: "Name",
source: hints,
templates: {
empty: [
"<div class='noitems'>",
"No Items Found",
"</div>"
].join("\n")
}
});
Run Code Online (Sandbox Code Playgroud)
处理错误的“正确”方法是使用该函数向 AJAX 调用添加错误处理prepare程序。如果您正在使用该wildcard选项,请注意它prepare会覆盖它。
例如,你可以这样:
new Bloodhound({
remote: {
url: REMOTE_URL,
wildcard: '%s'
}
});
Run Code Online (Sandbox Code Playgroud)
进入这个:
new Bloodhound({
remote: {
url: REMOTE_URL,
prepare: function(query, settings) {
return $.extend(settings, {
url: settings.url.replace('%s', encodeURIComponent(query)),
error: function(jqxhr, textStatus, errorThrown) {
// show error message
},
success: function(data, textStatus, jqxhr) {
// hide error message
}
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
返回的对象prepare用作设置对象,因此jQuery.ajax()您可以参考其文档。
Typeahead 的 Bloodhound建议引擎缺乏在远程源出现问题时通知用户的功能。
您可以使用 Typeahead 的源代码选项(请参阅此处) ,而不是使用 Bloodhound 来获取建议。通过在此处指定源,您可以处理错误并向用户显示合适的消息。
我在这里创建了一个示例:
http://jsfiddle.net/Fresh/oqL0g7jh/
答案的关键部分是源选项代码,如下所示:
$('.typeahead').typeahead(null, {
name: 'movies',
display: 'value',
source: function(query, syncResults, asyncResults) {
$.get(_url + query, function(movies) {
var results = $.map(movies.results, function(movie) {
return {
value: movie.original_title
}
});
asyncResults(results);
}).fail(function() {
$('#error').text('Error occurred during request!');
setTimeout("$('#error').text('');", 4000);
});
}
Run Code Online (Sandbox Code Playgroud)
源选项使用 jQuery 的 get 方法来检索数据。发生的任何错误都由延迟对象的失败方法处理。在该方法中,您可以适当地处理任何错误并向用户显示合适的消息。由于源函数是用三个参数指定的,这会导致 Typeahead 默认此调用为异步,因此调用:
asyncResults(results);
Run Code Online (Sandbox Code Playgroud)