私は素晴らしいTokenInputプラグインを使用しています(http://loopj.com/jquery-tokeninput/)レールがオートコンプリートを実行する場合、およびモデル内の通常のデータセットの場合、それは非常にうまく機能します。しかし、私の問題は、私の場合、実際に使用したいテキストボックスが2つあり、2番目のテキストボックスの提案は最初のテキストボックスの内容に依存する必要があるということです。具体的には、サッカークラブ(データベース内の既存のすべてのクラブからオートコンプリートできます)を選択してから、プレーしたチームを選択する必要があります。したがって、チームのオートコンプリートは、すでに選択されているクラブに関連付けられているチームのみを使用する必要があります。Railsやこのプラグインでそれを実行する方法や方法については完全にわかりません(ただし、プラグイン自体が実際に障害になることはありません)。 )。ここでの私の主な問題は、特にrailsと組み合わせたjavascriptの経験が不足していることだと思います。
2 に答える
あなたの質問には、さまざまなエッジケースが含まれる可能性があります。tokenInput メソッドの「onResult」を見てください。
おそらく、最初の入力フィールド (input-1) から現在の値を取得し、input-1 に対して input-2 に対して返された json を評価し、不要なものを除外することができます。rails が作成する json 配列にフィルター処理に必要な id 要素を含めなければならないことは明らかです。
<script type="text/javascript">
$(document).ready(function() {
$("#input-1").tokenInput("http://railsapp.com/your/search/action");
$("#input-2").tokenInput("http://railsapp.com/your/search/action", {
onResult: function (results) {
var input-1 = $("#input-1").val();
$.each(results, function (index, value) {
// some JS to keep only results which match input-1 values
});
return results;
}
});
});
</script>
免責事項: これは単なるアイデアです。
お役に立てれば。
ご回答有難うございます。onResult コールバックを使用する必要があることはわかっていましたが、間違った方向に考えました。したがって、あなたの答えは実際に私のアプローチを正しくするのに役立ちました。不要な結果を破棄するために、この小さなコードを使用して、必要な方法で 95% 動作するようにしました。
if (value.club_id != verein1){
results.splice(index,1)
}
残念ながら、問題は、 onResult コールバックが新しい検索に対してのみ呼び出されることを発見しなければならなかったことです。TokenInput プラグインは、サーバーの負荷を軽減するために検索/結果をキャッシュします。したがって、2 番目のボックスに最初の文字を入力すると、検索がトリガーされ、onResult が呼び出され、結果が正しくフィルタリングされます。だから、すべてがうまくいくようです。しかし、最初の文字を削除して再度入力すると、プラグインはキャッシュされた結果を使用し、onResult は呼び出されず、結果はフィルタリングされていないように見えます。つまり、最初のボックスにクラブを入力し、2 番目のボックスでチームを検索すると、すべてが正しくフィルタリングされます。しかし、クラブを削除して別のクラブを入力すると (たとえば、間違ったクラブを選択したなどの理由で)、チームの結果が正しくフィルタリングされなくなります。これは、検索文字列が 2 回表示されるたびにプラグインがキャッシュされた検索結果をスローするためです。ところで、キャッシュされた結果は生のフィルター処理されていないものであり、以前のフィルター処理を通過した結果の配列ではありません。
これがバグなのか、それとも意図されたものなのか、プラグインのソースコードを変更して変更しようとする試みが成功したのかどうかはわかりません。