入力したクエリに一致する結果のみを返すように typeahead.js を取得するのに問題があります。たとえば、会社の検索バーに「Facebook」と入力すると、すべての会社 (「Yahoo」、「Google」など) が返されますが、これらのほとんどはクエリに一致しません。サーバー側のデータ処理は行っていません。私の datumTokenizer 関数はこのフィルタリングを処理する必要がありますか?
また、クエリを変更するたびに、データごとに filter() 関数が入力されることに気付きました。したがって、クエリを「G」から「Go」に変更すると、filter: function (company_list) の console.log() ステートメントが 3000 回出力されます。
これが私のコードです:
var companies = new Bloodhound({
datumTokenizer: function (datum) {
return Bloodhound.tokenizers.whitespace(datum.name);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: '/json/company_list.json',
filter: function (companies_list) {
// Map the remote source JSON array to a JavaScript object array
return $.map(companies_list, function (company) {
console.log('mapping')
return {
name: company.name
};
});
}
}
});
// Initialize the Bloodhound suggestion engine
var promise = companies.initialize();
promise.done(function() {console.log('Bloodhound initialized!')});
// passing in `null` for the `options` arguments will result in the default
// options being used
$('#form-company').typeahead(null, {
name: 'companies',
displayKey: 'name',
// `ttAdapter` wraps the suggestion engine in an adapter that
// is compatible with the typeahead jQuery plugin
source: companies.ttAdapter()
});
そして、私のURLが返すものの例:
[{"name": "Yahoo"}, {"name": "Sanchai Technologies "}, {"name": "Oliver Wyman"}, {"name": "University of Oregon"}, ...]
プリフェッチがまったく機能しないため、リモートを使用しています。[object Object] という提案だけが表示されますが、これは意味がありません。prefetch/remote を使用して、初期化時に .json ファイル全体をロードし、サーバーにそれ以上の要求を行わないようにしたいと考えています。したがって、プリフェッチは私にとってより良いオプションだと思います(小さなファイル、77kB)が、まったく機能していません。
助けてくれてありがとう!