javascript - 当还剩下一个远程结果时,Typeahead Remote 返回两个未定义

标签 javascript typeahead.js typeahead twitter-typeahead

我正在构建从远程 json API 搜索信息的功能。我无法预取任何数据,因为数据集非常大(3000+),并且为了获得预取结果,我需要提供单个字母查询。

我遇到的问题是,当我在搜索中只剩下一个结果时,Typehead 停止给我结果,只显示两个未定义的项目作为结果。

这就是它的样子:

screenshot

此时我已经通过控制台尝试了所有我能想到的方法来尝试调试它,但无法找到任何地方来查看这些数据的来源。

这是 Bloodhound 和 typeahead 初始化的代码。

var items = new Bloodhound({
    datumTokenizer: function (datum) {
        return Bloodhound.tokenizers.whitespace(datum.k);
    },
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    remote: {
        url: App.target + "crm/sf/list/item/%QUERY/5",
        filter: function (parsedResponse) {
            return parsedResponse.Listing.list.entries;
        },
    }
});

items.initialize();

$('#itemNoSrch').typeahead(null, {
    autoselect: true,
    displayKey: 'k',
    source: items.ttAdapter()
}).on('typeahead:selected', function (obj, datum, name) {
    App.searchData.itemNo = datum.k.replace("/", "*");

    $('#itemSrchPlaceholder').val(datum.k);
    App.itemInvalid = false;
});

编辑:

以下是 crm/sf/list/item/%QUERY/5 的 JSON 响应,其中查询为 a。

{
"Listing": {
        "list": {
            "entries": [
                {
                    "k": "A-10-10",
                    "v": 1320
                },
                {
                    "k": "A-10-7",
                    "v": 4841
                },
                {
                    "k": "A-10-8",
                    "v": 4821
                },
                {
                    "k": "A14YV4835",
                        "v": 1327
                },
                {
                    "k": "A0554835",
                    "v": 1325
                }
            ]
        }
    }
}

下面是我如何只能假设发生这种情况时会出现输出,我在 Google Chrome 的最新稳定版本上使用了控制台。

enter image description here

我会提供一个基于 API 的 fiddle ,但服务器目前不添加跨域 header 。

请告知我所需的任何其他信息。

最佳答案

我发现问题了!当我的远程数据集是一个结果时,它作为对象而不是数组返回。

输出如下所示。

{
"Listing": {
    "list": {
        "entries": {
            "k": "A-10-10",
            "v": 1320
        }
    }
}

所以我在过滤器中添加了以下内容

filter: function (parsedResponse) {
        if(parsedResponse.Listing.list.entries instanceof Array){
            return parsedResponse.Listing.list.entries;
        }else{
            return [parsedResponse.Listing.list.entries];
        }
    },

关于javascript - 当还剩下一个远程结果时,Typeahead Remote 返回两个未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22309405/

相关文章:

jquery - 可以让 Twitter 的 Typeahead 插件最初向下滑动或淡入吗?

angularjs - 当用户输入速度非常快时,Typeahead 不起作用

javascript - Typeahead.js 自动完成不显示任何建议

javascript - 数据表的复杂 R Shiny 输入绑定(bind)问题

javascript - ReactJS:如果变量更改值则重新加载组件

javascript - 正则表达式删除所有非字母数字并用 + 替换空格

javascript - typeahead js不显示结果

javascript - 具有结构化值的 AngularJS Typeahead

angularjs - Angular Bootstrap Type Ahead 与 typeahead 语法相关的问题

javascript - 覆盖默认的 Tab 行为以专注于浏览器表单