7

私はjQuery UIオートコンプリート機能を使用しています。私はこれをjQueryのUIで提供されているこの例のように動作させることができます:jQuery UIのオートコンプリート(URLからのJSON)

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

これは問題なく動作します。

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

どのように私は私のURLを使用することができます:私は戻って、このようなJSONを取得し、そのURLに行くよ場合http://mysite.local/services/suggest.ashx?query=ball

:しかし、私はこのように取得することができます誰が私のデータソースとしてJSONを使用する必要がありますデータソースとして?

私はこのようなソース・オプションを変更しようとしました:

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

しかし、それは助けにはなりません。私は、サービスがどのキーワードが入力フィールドに入力されたのかわからないと思いますか?

すべてのポインタが優れています。

答えて

11

次の仕様(ウィジェットのdocumentationに記載されています)を満たすようにソースを変更する必要があります。ソース含む配列である(又は含む配列を返す)しなければならない:

  • 単純な文字列、または: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([]); 
      } 
     }); 
    }); 
}); 

あなたが見ることができるように、あなたはAJAXウィジェットのsourceオプションに機能して渡すことによって自分自身を呼び出すようにする必要があります。

アイデアは$.mapを使用して、オートコンプリートウィジェットが解析できる要素を含む配列に配列を変換することです。

また、AJAXコールに渡されるdataパラメータは、ユーザーが用語を入力すると?query=<term>となることに注意してください。

+0

あなたの答えをありがとう。 idとphraseの代わりに、返されたJSONをラベルと値に編集できると思います。しかし、返されたJSONを変更した場合は、私の例で正しいソースを使用したのか、何らかの形でサービスに入力したテキストを送信する必要があります。私はサービスが "クエリ"と呼ばれるパラメータを取ることを意味するので、何らかの方法で、そのパラメータもそれに送信する必要があると思います。または、私はここから完全に離れていますか? –

+0

あなたが正しいものを返すが、 'query'という引数を取るようにWebサービスを変更した場合、あなたのコードは' success'ハンドラで単に 'response(data)'を呼び出す以外は上記と似ています。つまり、デフォルトのAJAXリクエストを変更しているので、あなたはそれを自分で行う必要があります。 –

+0

偉大な、私は私の開発コンピュータに戻るときにそれを試してみます。そして、データ:{query:request.term}を書くことによって、右の入力をクエリパラメータとして右に呼び出してWebサービスが呼び出されますか? –

関連する問題