以前のバージョンでは次のことができました。
$('#search').typeahead({
name: 'Search',
remote: '/search?query=%QUERY'
});
しかし、0.10
更新、typeahead.jsはsource
を定義するように求めています。データセット関数を定義せずにリモートを定義するにはどうすればよいですか?
Typeahead.js バージョン0.10.0では、提案データを提供するために提案エンジンと呼ばれる別のコンポーネントが使用されるようになりました。 Typeahead.jsに同梱されている提案エンジンは、 Bloodhound と呼ばれます。
したがって、「データセット関数を定義せずにリモートを定義」することはできません。
リモートデータソースを使用したこの例(TheMovieDb APIを照会しています。たとえば、「エイリアン」を検索してみてください)は、次の場所にあります。
http://jsfiddle.net/Fresh/UkB7u/
コードは次のとおりです。
// Instantiate the Bloodhound suggestion engine
var movies = new Bloodhound({
datumTokenizer: function (datum) {
return Bloodhound.tokenizers.whitespace(datum.value);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: 'http://api.themoviedb.org/3/search/movie?query=%QUERY&api_key=470fd2ec8853e25d2f8d86f685d2270e',
filter: function (movies) {
// Map the remote source JSON array to a JavaScript object array
return $.map(movies.results, function (movie) {
return {
value: movie.original_title
};
});
}
}
});
// Initialize the Bloodhound suggestion engine
movies.initialize();
// Instantiate the Typeahead UI
$('.typeahead').typeahead(null, {
// Use 'value' as the displayKey because the filter function
// returns suggestions in a javascript object with a variable called 'value'
displayKey: 'value',
source: movies.ttAdapter()
});
フィルター関数を使用すると、重要なJSONデータソースから先読み候補として使用するものを選択できることに注意してください。
新しいバージョンのtypeaheadを使用している場合は、元の質問に基づいた実例がここにあります。
http://jsfiddle.net/Fresh/bbzt9hcr/
Typeahead 0.10.0に関して、新しいバージョン(0.11.1)には次の違いがあります。
次のようなことができます:
$('input#keywords').typeahead({
highlight: true,
},
{
name: 'brands',
display: 'value',
source: function(query, syncResults, asyncResults) {
$.get('/search?q=' + query, function(data) {
asyncResults(data);
});
}
})
Ajax POST dataの代わりに、より制御されたajax呼び出しのデータを取得したい場合は、次の構造を使用できます。
var meslekler = new Bloodhound({
datumTokenizer: function (d) {
return Bloodhound.tokenizers.whitespace(d.isim);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: 'my_url_with_or_without_%query_token.php',
ajax:{
type:"POST",
cache:false,
data:{
limit:5
},
beforeSend:function(jqXHR,settings){
settings.data+="&q="+$('.tt-input').typeahead('val');
},
complete:function(jqXHR,textStatus){
meslekler.clearRemoteCache();
}
}
}
});
meslekler.initialize();
$('.typeahead').typeahead(null, {
name:'meslekler',
displayKey: 'isim',
source: meslekler.ttAdapter()
});