プリフェッチを使用したいのですが、動作させることができません。これが私のコードです:
function initAutocompletion() {
$("input[data-autocomplete-prefetch-url]").each(function () {
var $this = $(this);
var urlPrefetch = $this.data("autocomplete-prefetch-url");
var prefetch;
pref = {
url: urlPrefetch,
filter: filter
};
var bloodHound = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
limit: 10,
prefetch: pref
});
bloodHound.initialize();
$this
.typeahead('destroy')
.typeahead({
hint: true,
highlight: true,
minLength: 1
},
{
displayKey: 'value',
source: bloodHound.ttAdapter()
});
});
}
function filter(list) {
return $.map(list, function (v) { return { value: v.toString() }; });
}
動作しません。
プリフェッチの代わりにリモートを使用すると機能します!
var bloodHound = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
limit: 10,
remote: pref
});
我慢できない。
誰かが私を助けることができますか?
これは、typeaheadがプリフェッチURLからデータを既にロードし、それをlocalStorage
に保存しているためです。データがlocalStorage
にあるとき、プリフェッチは呼び出されません。
以下のようにcacheKey
プリフェッチオプションを変更して、ページをリロードしてみてください。 localStorage
に新しいcacheKeyに関連付けられたデータがないため、プリフェッチが呼び出されます。
_var engine = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
prefetch: {
url: "stations.json",
cacheKey: "change here!"
}
});
_
chrome開発者ツールを使用してローカルストレージを確認することもできます。
ローカルストレージデータを削除して、ページをリロードしてみてください。プリフェッチが呼び出されます。
Bloodhoundの初期化が初期化のたびにプリフェッチを呼び出す前にlocalStorageデータを削除すること。
_localStorage.removeItem("YOUR CACHEKEY");
// Bloodhound initialization with YOUR CACHEKEY.
_
clearPrefetchCache()
の前のinitialize()
の方が良いと思います。
prefetch
が正常に機能していても、remote
を機能させるのに問題が発生しているときに、あなたの質問に遭遇しました。私は最初にキャッシュの問題に取り組みましたが(以前は問題だったため)、それでも機能しませんでした。
次に、typeaheadにtemplates
を実装しました。これにより、フィールドをクリックして入力したときに何が起こったのかについてフィードバックを得ることができました。 notFound
テンプレートが表示されていました。プリフェッチがサーバーにヒットするのを見ることができたので、これは奇妙に思えました。サーバーでのデバッグ出力により、サーバーが適切なjson応答を生成していることもわかりました。
Jsonを調べたところ、空白がなく、ブラッドハウンドdatumTokenizer
がBloodhound.tokenizers.whitespace
として構成されていることに気付きました。これにより、トークナイザーがどのように機能するかを深く掘り下げました。
これは非常に役に立ちました: https://github.com/Twitter/typeahead.js/blob/master/doc/migration/0.10.0.md#tokenization-methods-must-be-provided
次のように切り替えた後、問題は解決しました。
datumTokenizer: function(d) { return Bloodhound.tokenizers.whitespace(d.value);
(ここで、.value
は検索したいjsonプロパティです)
おそらく、urlPrefetchが値を取得する前にデータをプリフェッチしようとしています。 urlPrefetchをコンソールにダンプして、有効なURLがあることを確認してください。