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 をデータ ソースとして使用するにはどうすればよいですか?

source-option を次のように変更してみました。

$("#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 に答える