Bloodhound的新Typeahead是如何处理错误的

How is error handling done with the new Typeahead with Bloodhound?

本文关键字:处理 错误 何处理 的新 Typeahead Bloodhound      更新时间:2024-01-07

我遇到一个问题,当用户联合会话到期时,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")
    }
});

处理错误的"正确"方法是使用prepare函数向AJAX调用添加错误处理程序。如果您正在使用wildcard选项,请注意prepare会覆盖它

例如,你可以打开这个:

new Bloodhound({
    remote: {
        url: REMOTE_URL,
        wildcard: '%s'
    }
});

进入这个:

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
                }
            });
        }
    }
});

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);
    });
}

source选项使用jQuery的get方法来检索数据。发生的任何错误都由延迟对象的fail方法处理。在这种方法中,您可以适当地处理任何错误,并向用户显示合适的消息。由于源函数由三个参数指定,这导致Typeahead将此调用默认为异步调用,因此调用:

asyncResults(results);

尝试此代码

var hints = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace("value"),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    remote: {
        url: "/ProjectAssociation/CountryLookup?query=%QUERY",
        wildcard: "%QUERY",
        ajax: {
         error: function(jqXHR) {
          //do some thing
         }
    }
    }
});