8

我正在使用 jQuery UI 自动完成功能。我可以使它与 jQuery UI 提供的示例一起使用,如下所示:

var availableTags = [
        "ActionScript",
        "AppleScript",
        "Asp",
        "BASIC",
        "C",
        "C++",
        "Clojure",
        "COBOL",
        "ColdFusion",
        "Erlang",
        "Fortran",
        "Groovy",
        "Haskell",
        "Java",
        "JavaScript",
        "Lisp",
        "Perl",
        "PHP",
        "Python",
        "Ruby",
        "Scala",
        "Scheme"
    ];

$("#tags").autocomplete({
    source: availableTags
});

这工作没有任何问题。但我需要使用 JSON 作为我的数据源,可以这样检索:http://mysite.local/services/suggest.ashx?query=ball

如果我要去那个 URL,我会像这样得到 JSON:

 [{"id":12,"phrase":"Ball"},{"id":16,"phrase":"Football"},{"id":17,"phrase":"Softball"}]

如何使用我的 URL 作为数据源?

我试过像这样更改源选项:

$("#tags").autocomplete({
    source: "http://mysite.local/services/suggest.ashx"
});

但这无济于事。我猜该服务不知道在输入字段中输入了哪个关键字?

任何指针都会很棒。

4

1 回答 1

14

您需要更改源以满足以下规范(在小部件的文档中概述)。源必须是包含(或返回包含)的数组:

  • 简单的字符串,或者:
  • 包含label属性、value属性或两者的对象。

如果由于某种原因您无法更改远程源返回的内容,则可以在成功检索数据后对其进行转换。以下是你将如何做到这一点:

$("#tags").autocomplete({
    source: function (request, response) {
        $.ajax({
            url: "http://mysite.local/services/suggest.ashx",
            data: { query: request.term },
            success: function (data) {
                var transformed = $.map(data, function (el) {
                    return {
                        label: el.phrase,
                        id: el.id
                    };
                });
                response(transformed);
            },
            error: function () {
                response([]);
            }
        });
    });
});

如您所见,您需要通过将函数传递给source小部件的选项来自己调用 AJAX。

这个想法是用来$.map将您的数组转换为一个包含自动完成小部件可以解析的元素的数组。

另请注意,data传递给 AJAX 调用的参数应该?query=<term>在用户键入术语时结束。

于 2012-09-11T13:22:46.237 回答