1

これは難しいかもしれません - 私は Twitter のタイプアヘッドを Bloodhound エンジンとカスタム Knockout バインディングで使用しようとしています。私の例では、2 つのアスリート (フットボールとサッカー) のリストがあります。タイプアヘッドを使用してリストの 1 つからアスリートを選択し、ドロップダウンを使用してどのリストからプルするかを選択しています。

ドロップダウンからスポーツを選択すると、Bloodhound エンジンが適切なアスリートで初期化され、typeahead が作成されます。スポーツが変更されると、新しいアスリートのリストを使用して新しい Bloodhound エンジンが作成されます。問題は、タイプアヘッドがまだ新しいリストではなく最初のアスリートのリストを使用していることです。

デバッグを行ったところ、Bloodhound エンジンが新しいリストで再作成され、Twitter の先行入力が更新されたソースを取得することがわかりました。しかし悲しいことに、使用すると古いリストが表示されます。私はこのフィドルを証拠として提出します。スタイルは気にしないでください。これ進行中の作業です。コードを簡単に説明するには:

一番上にあるのはAthleteTypeaheadクラスで、カスタムathleteTypeaheadバインディング (クラスのすぐ後にある) が提案エンジンと先行入力を初期化するために作成します。下部にあるのは、2 つの異なるアスリート リストを作成するビュー モデルです。デバッグと私の正気のために、選択したアスリートの完全なリストをビューに表示しconsole.log、新しい Bloodhound 提案エンジンが作成されるたびにリストを送信しました - 両方のリストが正しく更新されます。clear()完全に新しいエンジンですが、新しいエンジンを作成するときに電話をかけてみましclearPrefetchCache()たが、運もありません。考え?

4

1 に答える 1

1

コンストラクターに追加$(element).typeahead('destroy')しますAthleteTypeahead。つまり、

var AthleteTypeahead = function(athletes, element) {
    $(element).typeahead('destroy');
    this.athletes = athletes;
    this.element = element;
};

すでにタイプアヘッドがある要素に新しいタイプアヘッドを作成することはできません。最初のものを破棄する必要があります。また、bloodhound エンジンへの参照をどこかに保存し、clearおよびadd関数を使用してエンジンを更新することもできます。タイプアヘッド全体を破棄して再初期化する必要はありません。

于 2015-04-01T05:31:40.310 に答える