【问题标题】:Typeahead search suggestions undefined - Remote Ajax预输入搜索建议未定义 - 远程 Ajax
【发布时间】:2014-10-07 23:48:47
【问题描述】:

我正在尝试将预先输入的远程源设置为 Web 方法,该方法将以 JSON 格式返回结果。

Ajax 正在取得成功,它正在正确地返回结果。下面代码中的控制台将打印如下

[{"Id":"1","Value":"Midhun"},{"Id":"2","Value":"Midhun2"}]

但是预先输入的建议都是未定义的

var typeHeadEngine = new Bloodhound({ 名称:'名称', 远程:{ url:'page.aspx/method',

        ajax: {
            type: "POST",
            data: JSON.stringify({ "query": '%QUERY' }),
            contentType: "application/json; charset=utf-8",
            dataType: "text",                
            success: function (data) {
                var obj = JSON.parse(data);
                console.log(obj.d);
                return obj.d;
            }

        }

    },
    datumTokenizer: function (d) {
        return Bloodhound.tokenizers.whitespace(d.val);
    },
    queryTokenizer: Bloodhound.tokenizers.whitespace
});

typeHeadEngine .initialize();

$('.typeahead').typeahead({
    hint: true,
    highlight: true,
    minLength: 3
},   {
  name: 'Name',
  displayKey: 'Value',
  source: typeHeadEngine.ttAdapter()

});

Web 方法正在返回 JSON 字符串,该字符串在 ajax 成功函数中转换为数组。在谷歌搜索期间,我发现 typeahead 需要数组而不是 JSON 对象,所以我正在转换为数组。

我经历了很多类似的问题来弄清楚。但我不能这样做,
谁能帮忙弄清楚我在这里做错了什么?

【问题讨论】:

    标签: javascript jquery typeahead.js twitter-typeahead bloodhound


    【解决方案1】:

    您不应该使用 ajax 选项的 success 字段来转换您的 JSON, 相反,您必须使用 Bloodhound 提供的 filter 字段:

    var typeHeadEngine = new Bloodhound({
    name: 'Name',
    remote: {
        url: 'page.aspx/method',
        ajax: {
            type: "POST",
            data: JSON.stringify({
                "query": '%QUERY'
            }),
            contentType: "application/json; charset=utf-8",
            dataType: "text"
        },
        filter: function (data) {
            var obj = JSON.parse(data);
            console.log(obj.d);
            return obj.d;
        }
    },
    datumTokenizer: function (d) {
        return Bloodhound.tokenizers.whitespace(d.val);
    },
    queryTokenizer: Bloodhound.tokenizers.whitespace
    });
    

    【讨论】:

    • 谢谢 :) ,需要在过滤器部分进行小改动,因为过滤器应该返回 ojects 。我们需要更改返回 obj.d;在代码中返回 eval(obj.d)。
    • 在我们执行JSON.parse(data) 之后,objobj.d 已经被解析为 JS 对象,因此上面的代码应该可以工作(并且在我的测试中确实如此)。另外,打电话给eval() 有点怀疑恕我直言。如果你必须使用 eval,可能你的 JSON 格式不正确?
    • 我的 JSON 格式与上述问题中提到的示例相同。可能是我没有以 JSON 格式返回 JSON 结果,而是将其作为文本发送。
    • 对不起,我的意思是结果是作为纯文本而不是 JSON 响应传输的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    相关资源
    最近更新 更多